# RegEx Pattern Question to Kem

**URL:** <https://forum.xojo.com/t/regex-pattern-question-to-kem/65856>\
**Category:** General\
**Created:** [September 30, 2021, 11:34pm UTC](https://forum.xojo.com/t/regex-pattern-question-to-kem/65856 "2021-09-30T23:34:08Z")\
**Posts on this page:** 18\
**Page:** 1

<div class="post-metadata">

**Author:** ![Martin\_T](https://forum.xojo.com/letter_avatar_proxy/v4/letter/m/a88e57/32.png) [@Martin\_T](https://forum.xojo.com/u/Martin_T)\
**Post date:** [September 30, 2021, 11:34pm UTC](https://forum.xojo.com/t/regex-pattern-question-to-kem/65856/1 "2021-09-30T23:34:08Z")

</div>

This is a new, maybe easy, question to our RegEx Pattern king @Kem_Tekinay.  
I’m looking for a working pattern to match this:

> 1. Name // variable length, no whitespaces
> 2. | // OPTIONAL: including optional .\* whitespaces before and behind |
> 3. [0-9]+ // OPTIONAL
> 4. / abc // OPTIONAL: including optional .\* whitespaces before # and the rest after /

Examples:

```auto
Valid:

Test
Test/follow us
Test|1
Test | 100
Test | 1/follow us

```

---

<div class="post-metadata">

**Author:** ![Kem\_Tekinay](https://forum.xojo.com/user_avatar/forum.xojo.com/kem_tekinay/32/154_2.png) [@Kem\_Tekinay](https://forum.xojo.com/u/Kem_Tekinay)\
**Post date:** [September 30, 2021, 11:39pm UTC](https://forum.xojo.com/t/regex-pattern-question-to-kem/65856/2 "2021-09-30T23:39:53Z")

</div>

Specifically what kind of white space? Just spaces, spaces and tabs, or linefeeds too?

---

<div class="post-metadata">

**Author:** ![Martin\_T](https://forum.xojo.com/letter_avatar_proxy/v4/letter/m/a88e57/32.png) [@Martin\_T](https://forum.xojo.com/u/Martin_T)\
**Post date:** [September 30, 2021, 11:41pm UTC](https://forum.xojo.com/t/regex-pattern-question-to-kem/65856/3 "2021-09-30T23:41:28Z")

</div>

Just normal whitespaces (ASCII: 32).

If possible, could you please do it with subroutines, so we can get a better overview over the pattern?

```auto
(?(DEFINE)
...single parts
)

```

---

<div class="post-metadata">

**Author:** ![Kem\_Tekinay](https://forum.xojo.com/user_avatar/forum.xojo.com/kem_tekinay/32/154_2.png) [@Kem\_Tekinay](https://forum.xojo.com/u/Kem_Tekinay)\
**Post date:** [September 30, 2021, 11:45pm UTC](https://forum.xojo.com/t/regex-pattern-question-to-kem/65856/4 "2021-09-30T23:45:23Z")

</div>

Fyi, “whitespace” refers to spaces, tabs, vertical tabs, carriage returns, linefeeds, and some other invisible characters.

> [@Martin\_T](#):
>
> If possible, could you please do it with subroutines, so we can get a better overview over the pattern?

Funny guy.

---

<div class="post-metadata">

**Author:** ![Kem\_Tekinay](https://forum.xojo.com/user_avatar/forum.xojo.com/kem_tekinay/32/154_2.png) [@Kem\_Tekinay](https://forum.xojo.com/u/Kem_Tekinay)\
**Post date:** [September 30, 2021, 11:53pm UTC](https://forum.xojo.com/t/regex-pattern-question-to-kem/65856/5 "2021-09-30T23:53:56Z")

</div>

Try this:

```auto
^\w+( *\| *\d+)?( */ *.+)?$

```

This assumes that each of these will be on a line by themselves.

---

<div class="post-metadata">

**Author:** ![Martin\_T](https://forum.xojo.com/letter_avatar_proxy/v4/letter/m/a88e57/32.png) [@Martin\_T](https://forum.xojo.com/u/Martin_T)\
**Post date:** [October 1, 2021, 12:14am UTC](https://forum.xojo.com/t/regex-pattern-question-to-kem/65856/6 "2021-10-01T00:14:19Z")

</div>

> [@Kem\_Tekinay](#):
>
> This assumes that each of these will be on a line by themselves.

Right.

Thanks Kem. This works for me:

```auto
^(?'Name'\w+)(?'Separator' *\| *)?(?'Number'\d+)?(?'Slash' */ *.*)?$

```

---

<div class="post-metadata">

**Author:** ![Kem\_Tekinay](https://forum.xojo.com/user_avatar/forum.xojo.com/kem_tekinay/32/154_2.png) [@Kem\_Tekinay](https://forum.xojo.com/u/Kem_Tekinay)\
**Post date:** [October 1, 2021, 12:24am UTC](https://forum.xojo.com/t/regex-pattern-question-to-kem/65856/7 "2021-10-01T00:24:54Z")

</div>

That would match “name3”, fyi.

---

<div class="post-metadata">

**Author:** ![Martin\_T](https://forum.xojo.com/letter_avatar_proxy/v4/letter/m/a88e57/32.png) [@Martin\_T](https://forum.xojo.com/u/Martin_T)\
**Post date:** [October 1, 2021, 12:29am UTC](https://forum.xojo.com/t/regex-pattern-question-to-kem/65856/8 "2021-10-01T00:29:20Z")

</div>

What do you mean? Since `name3` will be a “single” word without whitespace, it’ll be valid.

---

<div class="post-metadata">

**Author:** ![Kem\_Tekinay](https://forum.xojo.com/user_avatar/forum.xojo.com/kem_tekinay/32/154_2.png) [@Kem\_Tekinay](https://forum.xojo.com/u/Kem_Tekinay)\
**Post date:** [October 1, 2021, 12:52am UTC](https://forum.xojo.com/t/regex-pattern-question-to-kem/65856/9 "2021-10-01T00:52:38Z")

</div>

Brain freeze. You’re right, of course.

---

<div class="post-metadata">

**Author:** ![Martin\_T](https://forum.xojo.com/letter_avatar_proxy/v4/letter/m/a88e57/32.png) [@Martin\_T](https://forum.xojo.com/u/Martin_T)\
**Post date:** [October 1, 2021, 12:55am UTC](https://forum.xojo.com/t/regex-pattern-question-to-kem/65856/10 "2021-10-01T00:55:41Z")

</div>

> [@Kem\_Tekinay](#):
>
> `\w+`

This does not care about emojis or composite characters.

> [@Martin\_T](#):
>
> `(?'Slash' */ *.*)`

How can I add an alternative, say `++`. So `/`and `++` will be valid?

---

<div class="post-metadata">

**Author:** ![Kem\_Tekinay](https://forum.xojo.com/user_avatar/forum.xojo.com/kem_tekinay/32/154_2.png) [@Kem\_Tekinay](https://forum.xojo.com/u/Kem_Tekinay)\
**Post date:** [October 1, 2021, 1:16am UTC](https://forum.xojo.com/t/regex-pattern-question-to-kem/65856/11 "2021-10-01T01:16:56Z")

</div>

```auto
(\+\+|/)

```

---

<div class="post-metadata">

**Author:** ![Martin\_T](https://forum.xojo.com/letter_avatar_proxy/v4/letter/m/a88e57/32.png) [@Martin\_T](https://forum.xojo.com/u/Martin_T)\
**Post date:** [October 1, 2021, 1:28pm UTC](https://forum.xojo.com/t/regex-pattern-question-to-kem/65856/12 "2021-10-01T13:28:57Z")

</div>

@Kem_Tekinay, how can the pattern also takes care about such a construction:

```auto
🙅🏿‍♂️/India
HumanOf🙅🏿‍♂️/India

```

`🙅🏿‍♂️` / `HumanOf🙅🏿‍♂️` should be matched as **Name**.

---

<div class="post-metadata">

**Author:** ![Kem\_Tekinay](https://forum.xojo.com/user_avatar/forum.xojo.com/kem_tekinay/32/154_2.png) [@Kem\_Tekinay](https://forum.xojo.com/u/Kem_Tekinay)\
**Post date:** [October 1, 2021, 2:23pm UTC](https://forum.xojo.com/t/regex-pattern-question-to-kem/65856/13 "2021-10-01T14:23:49Z")

</div>

Try this:

```auto
^(?'Name'(?:(?!\+\+|[\s/|[:punct:]]).)+)(?'Separator' *\| *)?(?'Number'\d+)?(?'Slash' *(?:/|\+\+) *.*)?$

```

---

<div class="post-metadata">

**Author:** ![Martin\_T](https://forum.xojo.com/letter_avatar_proxy/v4/letter/m/a88e57/32.png) [@Martin\_T](https://forum.xojo.com/u/Martin_T)\
**Post date:** [October 1, 2021, 8:45pm UTC](https://forum.xojo.com/t/regex-pattern-question-to-kem/65856/14 "2021-10-01T20:45:22Z")

</div>

Thanks @Kem_Tekinay,  
looks like the pattern works, but you RegExRX App doesn’t match the right selection range. I think you use `String.Length` instead of `String.Bytes` to select the right range.

 ![RegExRX](https://forum.xojo.com/uploads/default/original/2X/4/4921a3b00a49ff40da9e3cf488f71d4586868f4b.png)

---

<div class="post-metadata">

**Author:** ![Kem\_Tekinay](https://forum.xojo.com/user_avatar/forum.xojo.com/kem_tekinay/32/154_2.png) [@Kem\_Tekinay](https://forum.xojo.com/u/Kem_Tekinay)\
**Post date:** [October 1, 2021, 8:46pm UTC](https://forum.xojo.com/t/regex-pattern-question-to-kem/65856/15 "2021-10-01T20:46:57Z")

</div>

I saw.

I do some fancy things there to match bytes to characters, and it mostly works, but clearly failed here. I’ll have to see if a newer version of Xojo fixes those issues.

---

<div class="post-metadata">

**Author:** ![Martin\_T](https://forum.xojo.com/letter_avatar_proxy/v4/letter/m/a88e57/32.png) [@Martin\_T](https://forum.xojo.com/u/Martin_T)\
**Post date:** [October 2, 2021, 3:51pm UTC](https://forum.xojo.com/t/regex-pattern-question-to-kem/65856/16 "2021-10-02T15:51:15Z")

</div>

@Kem_Tekinay, for now it works great, but I need one more extension:

```auto
Test[acdc]/follow us

```

`Test[acdc]` should be matched as **Name**.

---

<div class="post-metadata">

**Author:** ![Kem\_Tekinay](https://forum.xojo.com/user_avatar/forum.xojo.com/kem_tekinay/32/154_2.png) [@Kem\_Tekinay](https://forum.xojo.com/u/Kem_Tekinay)\
**Post date:** [October 3, 2021, 3:30am UTC](https://forum.xojo.com/t/regex-pattern-question-to-kem/65856/17 "2021-10-03T03:30:29Z")

</div>

Let try is this way. This pattern specifies what’s permitted, including every unicode character \>= 128 . It’s also in free-space mode for readability.

If you want to allow any other characters (or not allow ones I’ve allowed), modify the ‘Name’ character class.

```auto
(?x)
^
(?'Name' [\w[\]{}()\x{80}-\x{10ffff}]+)
(?'Separator' \x20* \| \x20*)?
(?'Number' \d+)?
(?'Slash' \x20* (?:/|\+\+) \x20* .*)?
$

```

---

<div class="post-metadata">

**Author:** ![Martin\_T](https://forum.xojo.com/letter_avatar_proxy/v4/letter/m/a88e57/32.png) [@Martin\_T](https://forum.xojo.com/u/Martin_T)\
**Post date:** [October 3, 2021, 9:44am UTC](https://forum.xojo.com/t/regex-pattern-question-to-kem/65856/18 "2021-10-03T09:44:18Z")

</div>

Thanks @Kem_Tekinay, looks good to me.
