Welcome, Guest
Username: Password: Remember me

TOPIC: Regular expression Library

Regular expression Library 23 Sep 2012 16:53 #3917

  • admin
  • admin's Avatar
  • Online
  • Administrator
  • Chef
  • Posts: 3711
  • Thank you received: 984
  • Karma: 140
Here a very good regular expressions library :

regexlib.com
Coding is now a piece of cake
Last Edit: 23 Sep 2012 16:55 by admin.
The administrator has disabled public write access.
The following user(s) said Thank You: BTB300

Re: Regular expression Library 24 Sep 2012 15:18 #3966

  • JoomGuy
  • JoomGuy's Avatar
  • Offline
  • Moderator
  • Joomla Enthusiast, Lover of Cooking
  • Posts: 1115
  • Thank you received: 195
  • Karma: 64
Thanks for opening the new board admin!

Gez
Need help with your Cook/Joomla Project? . PM me to find out what I can help with. NO time wasters please!!!
The administrator has disabled public write access.

Re: Regular expression Library 10 Nov 2012 23:43 #5248

  • g1smd
  • g1smd's Avatar
  • Offline
  • Junior Member
  • RegEx fiend!
  • Posts: 31
  • Thank you received: 26
  • Karma: 6
A cautious warning that RegExLib contains some inefficient and badly written patterns with various syntax and/or logic errors.

Before using any of the patterns, be sure to work out exactly how it works, whether it matches exactly what you want to do, and then strive to improve it.

At the very least, test it with a wide range of both valid and non-valid data to be sure it does what it should!.
Online since 1996.
The administrator has disabled public write access.
The following user(s) said Thank You: JoomGuy

Re: Regular expression Library 11 Nov 2012 09:44 #5259

  • g1smd
  • g1smd's Avatar
  • Offline
  • Junior Member
  • RegEx fiend!
  • Posts: 31
  • Thank you received: 26
  • Karma: 6
Here's a critique of one pattern found in the library:

Pattern for UK landlines and mobiles

Your pattern:
^((\(44\))( )?|(\(\+44\))( )?|(\+44)( )?|(44)( )?)?((0)|(\(0\)))?( )?(((1[0-9]{3})|(7[1-9]{1}[0-9]{2})|(20)( )?[7-8]{1})( )?([0-9]{3}[ -]?[0-9]{3})|(2[0-9]{2}( )?[0-9]{3}[ -]?[0-9]{4}))$
is very inefficient and fails to match many valid UK numbers even when entered in the right format.

Many of the brackets are redundant.

----

The opening part:
^((\(44\))( )?|(\(\+44\))( )?|(\+44)( )?|(44)( )?)?((0)|(\(0\)))?( )?
has a few problems.

The (\(44\)) simplifies to \(44\) for example and ( )? should be \s? too.

The repetition of '44' is unecessary. After you've found it once, move on!

The 44 and the optional trailing space are common to all four options and should be stated only once.

The (\(44\))( )?|(\(\+44\))( )? 'OR' construct simplifies to \(\+?44\)\s? for example.

The (\+44)( )?|(44)( )?) 'OR' construct simplifies to \+?44\s? too.

Both of those then reduce to \(?(\+?44\)?\s?) with optional parentheses and spaces.

Don't insist the user enters balanced parentheses. It's the digits that matter.


When the user enters a number in international format, the pattern insists on a 0 after the +44. The 0 should not be there, but some people mistakenly type it. You should make the 0 optional, and with optional parentheses.

Without providing for a 0 after the +44, the opening part simplifies to:
^\(?(\+?44\)?\s?\(?|0)
which is optional opening parentheses followed by +44 and optional closing parentheses, then optional space and optional opening parentheses, OR initial optional opening parentheses followed by the 0 trunk code.

With provision for optional parentheses and a 0 after the +44 added back in it becomes:
^\(?(\+?44\)?\s?\(?(0\)?\s?\(?)?|0)

----

If you want to also allow 00 44 and 011 44 (as well as the usual +44 country code and 0 trunk code) along with parentheses, spaces and hyphens, and the optional (0) in optional parentheses after the +44 country code, try:
^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)
for the opening part.

----

The remainder of your pattern:
(((1[0-9]{3})|(7[1-9]{1}[0-9]{2})|(20)( )?[7-8]{1})( )?([0-9]{3}[ -]?[0-9]{3})|(2[0-9]{2}( )?[0-9]{3}[ -]?[0-9]{4}))$
doesn't match all UK formats and has a few syntax issues, discussed below.

The [1-9]{1} should be just [1-9]. The {1} is redundant.

The ( )? should be \s? here.

----

The 'London' part of the pattern:
(.....|.....|(20)( )?[7-8]{1})( )?([0-9]{3}[ -]?[0-9]{3})|.....)
is problematical.

The literal (20) does not need to be in brackets, but isn't needed at all (see below).

The [7-8] should be [78] but note that London numbers also begin with 3 now [378].

The {1} is always redundant.

The [ -]? is better coded as [\s-]? as it is easy to accidentally add a rogue space or delete a needed space without noticing.

Your London pattern fails in other ways too.

It expects ...20 7 XXX XXX or ...20 8 XXX XXX which is also a digit short of reality and in a completely incorrect format. London numbers are 2+8 format (e.g. 020 3555 7788), not 3+6 or 2+7 or whatever this is.

There is no need for a London pattern. You need a pattern for all 02 numbers. All 02 numbers use 2+8 format.

This part (20)( )?[7-8]{1} of your pattern could be completely removed (read on).

----

This part of the pattern for 01 and 07 numbers:
(((1[0-9]{3})|(7[1-9]{1}[0-9]{2})|.....)( )?([0-9]{3}[ -]?[0-9]{3})|(.....))$
matches 01 and 07 numbers only in 4+6 format.

It fails to match valid UK 01 numbers in the real 3+7 (e.g. 0116 555 8888 or 0121 555 7777), 4+5 (e.g. 01750 62555), 5+5 (e.g. 015395 77888) and 5+4 (e.g. 016977 3888) formats.

No UK area codes begin 010, so the first 1[0-9]{3} could be 1[1-9][0-9]{2} if other adjustments were made later in the pattern, but there's a better way altogether (discussed at the end).

Amending the pattern to accept 5+4, 5+5, 4+5, 4+6 and 3+7 format numbers gives this:
(?:\d{5}\)?[\s-]?\d{4,5}|\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3})|\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4})$
with provision for optional closing parentheses after the area code followed by optional hyphen or space.

The new pattern also provides for optional space or hyphen within the subscriber part of the number.

This part of the new pattern doesn't care what the leading digit is, so it allows numbers to be entered in the 'wrong' format (e.g. 01884 777 888 as 018 8477 7888, 020 3555 7788 as 02035 557 788 and 07788 555777 as 0778 855 5777, etc). Those that are entered in the wrong format should be corrected by a later process.

----

Your final chunk of code:
((.....|.....|.....)( )?(.....)|(2[0-9]{2}( )?[0-9]{3}[ -]?[0-9]{4}))$
looks like it should be matching 02 area codes, but it also has problems.

02 area codes use the 2+8 format (e.g. 020 8123 4567) but your pattern expects them to be entered in 3+7 format.

They should be able to be entered in either format (then corrected to 2+8 format for display).

Here's the correct pattern for 2+8 format:
\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}
with provision for optional closing parentheses after the area code followed by optional hyphen or space.

It also provides for optional space or hyphen within the subscriber part of the number.

The long pattern in the previous section allows 02 numbers to be entered in 5+5, 4+6 or 3+7 format. If the user does that, the number should be corrected to the right format for display.

----

Do also consider replacing [0-9] with \d for readability; so that character groups are used only for reduced ranges.

Don't insist on mandatory brackets, allow them to be optional.

Don't insist on 'balanced' brackets on user input. As long as the user puts all the right digits in, the brackets really don't matter.

Don't restrict the format the user can use for input. If the user types 015 3957 7888 or 0153 957 7888 or 01539 577888 instead of 015395 77888, let them do that. All the digits are there. Reformat it correctly for display afterwards.

----

Testing

Your current pattern is this:
^((\(44\))( )?|(\(\+44\))( )?|(\+44)( )?|(44)( )?)?((0)|(\(0\)))?( )?(((1[0-9]{3})|(7[1-9]{1}[0-9]{2})|(20)( )?[7-8]{1})( )?([0-9]{3}[ -]?[0-9]{3})|(2[0-9]{2}( )?[0-9]{3}[ -]?[0-9]{4}))$

What your current pattern needs to match, and whether it does:

016977 3888 [5+4] - no
017687 55555 [5+5] - no
01750 62555 [4+5] - no
0175 062 555 (alt) - no
0175 062555 (alt) - no
01884 777 888 [4+6] - yes
01884 777888 [4+6] - yes
0116 555 7788 [3+7] - no
0191 777 8899 [3+7] - no
020 3555 7788 [2+8] - no
0203 555 7788 (alt) - yes
02035 557 788 (alt) - no
020355 57788 (alt) - no
024 7555 8899 [2+8] - no
074557 77888 (alt) - no
07555 777 888 [4+6] - yes
07555 777888 [4+6] - yes
0775 577 7888 (alt) - no
078 5577 7888 (alt) - no

(alt) means "alternative spacing that some people might use to enter a number".

While spaces are optional in your pattern, most of the parentheses are not but should be.

Since 03 numbers are charged at the same rate as 01 and 02 numbers, the pattern should also match those.

----

Some suggestions

Use the corrected opening part from above:
^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)

then match numbers input in 5+4, 5+5, 4+5, 4+6, 3+6, 3+7, 2+8 format:
(?:\d{5}\)?[\s-]?\d{4,5}|\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3})|\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4}|\d{2}\)?[\s-]?\d{4}[\s-]?\d{4})$

Actually, just realised there's another efficiency gain to be had by altering the order in the second part of the pattern so that shorter area codes match first.

Match numbers in 2+8, 3+6, 3+7, 4+5, 4+6, 5+4, 5+5 format:
(?:\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}|\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4}|\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3})|\d{5}\)?[\s-]?\d{4,5})$

Putting it all together:
^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)(?:\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}|\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4}|\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3})|\d{5}\)?[\s-]?\d{4,5})$


Once you have matched the input format, extract the 44 country code in $1 (null if national format was used with 0 trunk code) and the NSN in $2 with this second pattern:
^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)(44)\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d-]+)$
Clean the extracted NSN of all spaces and punctuation.

Finally, you can now check the NSN part in more detail.

Check that the NSN begins ^(1[1-9]|2[03489]|7([457-9]|624)) if you want to restrict the input to landlines (01, 02) and mobile numbers (074, 075, 07624, 077, 078, 079).

Consider also allowing 03 numbers as these are always charged at the same rate as 01 and 02 numbers: ^(1[1-9]|2[03489]|3[0347]|7([457-9]|624))

You can make much more detailed checks here if you want. You can even discover the number type by the initial digits.

This part is much simpler to program now that the dial prefix, country code, trunk prefix and any puncuation clutter has been dumped.

There's a very full list of patterns at: www.aa-asterisk.org.uk/index.php/Regular...GB_Telephone_Numbers
Online since 1996.
Last Edit: 11 Nov 2012 21:49 by g1smd. Reason: Fix RegEx typo.
The administrator has disabled public write access.
The following user(s) said Thank You: admin, JoomGuy

Re: Regular expression Library 11 Nov 2012 09:49 #5260

  • JoomGuy
  • JoomGuy's Avatar
  • Offline
  • Moderator
  • Joomla Enthusiast, Lover of Cooking
  • Posts: 1115
  • Thank you received: 195
  • Karma: 64
Hi @g1smd,

Thanks for this! As a novice RegExer, this breakdown/critique of a real life pattern is super useful in further understanding the deeper logic in these very complex beasts! For that, yet another k+1! I'm sure that a lot of people will find this useful!!!

Many thanks,

Gez
Need help with your Cook/Joomla Project? . PM me to find out what I can help with. NO time wasters please!!!
The administrator has disabled public write access.

Re: Regular expression Library 11 Nov 2012 10:41 #5263

  • g1smd
  • g1smd's Avatar
  • Offline
  • Junior Member
  • RegEx fiend!
  • Posts: 31
  • Thank you received: 26
  • Karma: 6
One other tip when developing a complex pattern is to use placeholders for commonly found elements while you are working on the overall pattern logic.

The "optional space and hyphen" character group can be temporarily replaced with an underscore, so [\s-]? is temporarily represented by _ here.

When a pattern has parentheses for grouping as well as literal parentheses in the data input, replace the literal parentheses with < and > while you're working on the pattern. So \(? is represented by < and \)? is represented by > and you change them over at the end.

Likewise, non-capturing groupings using (?: can be represented by ( while you are working on the pattern.

The pattern:
^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)(?:\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}|\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4}|\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3})|\d{5}\)?[\s-]?\d{4,5})$
is quite unreadable.

This is still difficult:
^<((0(0|11)>_<|\+)44>_<(0>_<)?|0)(\d{2}>_\d{4}_\d{4}|\d{3}>_\d{3}_\d{3,4}|\d{4}>_(\d{5}|\d{3}_\d{3})|\d{5}>_\d{4,5})$
but not so much.

You can add spaces into the pattern to make things more clear, while you are working on it, but do remember to remove all the spaces!
^<  (  ( 0(0|11)>_< | \+ ) 44>_<  (0>_<)?  |  0  )    (  \d{2}>_\d{4}_\d{4} | \d{3}>_\d{3}_\d{3,4} | \d{4}>_(\d{5}|\d{3}_\d{3}) | \d{5}>_\d{4,5}  )$
Using a text editor that highlights matching parentheses is also very useful.

It's a simple matter to bulk replace:
(   =>   (?:
_   =>   [\s-]?
<   =>   \(?
>   =>   \)?
at the end.


You could even simplify the \d{x} and \d{x,y} constructs to {x} and {x,y}:
^<  (  ( 0(0|11)>_< | \+ ) 44>_<  (0>_<)?  |  0  )    (  {2}>_{4}_{4} | {3}>_{3}_{3,4} | {4}>_ ({5}|{3}_{3}) | {5}>_{4,5} )$
and it's a simple matter to replace every occurrence of { with \d{ at the end.


Notice that "optional parentheses around something with optional space after" patterns aren't done as \(?X\)?\s? or <X>_ but instead as leading ^\(? or ^< right at the beginning of the pattern and then X\)?\s?\(? or X>_< after each X object thereby allowing for the opening parentheses on the next object and no need to "backoff and retry" at any point in the parsing. This is a huge efficiency gain and avoids ambiguity.

(020) 3555 7788:
^< ( ( 0(0|11)>_< | \+ ) 44>_< (0>_<)? | 0 ) ( {2}>_{4}_{4} | {3}>_{3}_{3,4} | {4}>_ ({5}|{3}_{3}) | {5}>_{4,5} )$

+44 1750 62555:
^< ( ( 0(0|11)>_< | \+ ) 44>_< (0>_<)? | 0 ) ( {2}>_{4}_{4} | {3}>_{3}_{3,4} | {4}>(_ {5}|{3}_{3}) | {5}>_{4,5} )$

011 (44) 7555 777888:
^< ( ( 0(0|11)>_< | \+ ) 44>_< (0>_<)? | 0 ) ( {2}>_{4}_{4} | {3}>_{3}_{3,4} | {4}>_ ({5}|{3}_{3}) | {5}>_{4,5} )$

+44 (0) 121 555 7788:
^< ( ( 0(0|11)>_< | \+ ) 44>_< (0>_<)? | 0 ) ( {2}>_{4}_{4} | {3}>_{3}_{3,4} | {4}>_ ({5}|{3}_{3}) | {5}>_{4,5} )$

(+44) 0 (116) 5557777:
^< ( ( 0(0|11)>_< | \+ ) 44>_< (0>_<)? | 0 ) ( {2}>_{4}_{4} | {3}>_{3}_{3,4} | {4}>_ ({5}|{3}_{3}) | {5}>_{4,5} )$

(00) 44 (0) 16977 3888:
^< ( ( 0(0|11)>_< | \+ ) 44>_< (0>_<)? | 0 ) ( {2}>_{4}_{4} | {3}>_{3}_{3,4} | {4}>_ ({5}|{3}_{3}) | {5}>_{4,5} )$

Remember:
(      =>    (?:
_      =>    [\s-]?
<      =>    \(?
>      =>    \)?
{x}    =>    \d{x}
{x,y}  =>    \d{x,y}

Allowing a few more dial prefix permutations: (00) (+44)..... [+ after 00], (011) (+44).....[+ after 011], (44) (20).....[44 without +], (0) (20).....[0 in () at start]:
^<  (  ( 0(0|11)>_<\+? | \+ )? 44>_<  (0>_<)?  |  0>_<  )    (  {2}>_{4}_{4} | {3}>_{3}_{3,4} | {4}>_ ({5}|{3}_{3}) | {5}>_{4,5} )$
^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?\+?|\+)?44\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0\)?[\s-]?\(?)(?:\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}|\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4}|\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3})|\d{5}\)?[\s-]?\d{4,5})$
OR, removing the optional \+ repetition:
^<  (  ( 0(0|11)>_< )?  \+? 44>_<  (0>_<)?  |  0>_<  )    (  {2}>_{4}_{4} | {3}>_{3}_{3,4} | {4}>_ ({5}|{3}_{3}) | {5}>_{4,5} )$
^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?)?\+?44\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0\)?[\s-]?\(?)(?:\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}|\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4}|\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3})|\d{5}\)?[\s-]?\d{4,5})$

and if you're happy to allow just (20) 3777 5577 [without any dial prefix] use:
^<  (  ( 0(0|11)>_< )?  \+? 44>_<  )?    (0>_<  )?    (  {2}>_{4}_{4} | {3}>_{3}_{3,4} | {4}>_ ({5}|{3}_{3}) | {5}>_{4,5} )$
^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?)?\+?44\)?[\s-]?\(?)?(?:0\)?[\s-]?\(?)?(?:\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}|\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4}|\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3})|\d{5}\)?[\s-]?\d{4,5})$


oh, and there's repetition for the first two digits of the subscriber number, fix that by using:
^<  (  ( 0(0|11)>_< )?  \+? 44>_<  )?    (0>_<  )?    {2}    (  >_{4}_{4} | {1}>_{3}_{3,4} | {2}>_ ({5}|{3}_{3}) | {3}>_{4,5} )$
^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?)?\+?44\)?[\s-]?\(?)?(?:0\)?[\s-]?\(?)?\d{2}(?:\)?[\s-]?\d{4}[\s-]?\d{4}|\d\)?[\s-]?\d{3}[\s-]?\d{3,4}|\d{2}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3})|\d{3}\)?[\s-]?\d{4,5})$

and if you really don't care about the format (closing brackets, hyphens and spacing) after the area code at all, as long as it has 9 or 10 digits (e.g. allow input like (020) 7)5)5)5) 7)7)8)8 or (017)5)0) 6)2)5)5)5 or similar) use:
^<  (  ( 0(0|11)>_< )?  \+? 44>_<  )?    (0>_<  )?    [1-357-9]    (>_\d){8,9}$
^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?)?\+?44\)?[\s-]?\(?)?(?:0\)?[\s-]?\(?)?[1-357-9](?:\)?[\s-]?\d){8,9}$

or limiting optional closing brackets to after the 2nd to 5th digits (e.g. allow input like (020) 7)5)5)5 7788 or (017)5)0) 6)2555 or similar):
^<  (  ( 0(0|11)>_< )?  \+? 44>_<  )?    (0>_<  )?    [1-357-9]\d    (>_\d){4}    (_\d){3,4}$
^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?)?\+?44\)?[\s-]?\(?)?(?:0\)?[\s-]?\(?)?[1-357-9]\d(?:\)?[\s-]?\d){4}(?:[\s-]?\d){3,4}$

So many options, all slightly different!
Online since 1996.
Last Edit: 14 Nov 2012 21:01 by g1smd. Reason: Additonal RegEx patterns.
The administrator has disabled public write access.
The following user(s) said Thank You: JoomGuy

Re: Regular expression Library 11 Nov 2012 12:03 #5268

  • admin
  • admin's Avatar
  • Online
  • Administrator
  • Chef
  • Posts: 3711
  • Thank you received: 984
  • Karma: 140
Oh my god !

Very good stuff. I didn't read it all but it seems to be a very nive piece of study.
Man... amazing !
It is very specific but I hope it can help a lot of people.

Whit such studies and tests and sharing, of course you can be critical with the RegEx Lib.

I think the same, RegEx can never been copy/pasted it is too complex and never fits exaclty with what we want.

I think if you have such good skills on Regex, it will help a lot of users.
K+1
Coding is now a piece of cake
The administrator has disabled public write access.
The following user(s) said Thank You: g1smd

Re: Regular expression Library 11 Nov 2012 13:18 #5270

  • g1smd
  • g1smd's Avatar
  • Offline
  • Junior Member
  • RegEx fiend!
  • Posts: 31
  • Thank you received: 26
  • Karma: 6
Yes, it's very specific but I hope it conveys some of the techniques that I use when I work on this stuff.

It is a very difficult subject and the proof of that is that both of the above posts were re-edited more than 20 times each to get rid of various typos and errors. Even so, there still might be a typo somewhere in there. :oops: :unsure:

If this was code for a "real" project (err, a simpler version of the pattern is in the jQuery-Validation "additional methods" file) it would be tested with a wide variety of valid and non-valid numbers just to be sure. The test list would consist of hundreds of numbers testing every permutation with and without spaces and hyphens and parentheses in each position for each of the number lengths and formats.
Online since 1996.
Last Edit: 11 Nov 2012 20:33 by g1smd. Reason: edits: 10+ => 20+
The administrator has disabled public write access.
The following user(s) said Thank You: admin, JoomGuy

Re: Regular expression Library 21 Nov 2012 14:54 #5569

  • admin
  • admin's Avatar
  • Online
  • Administrator
  • Chef
  • Posts: 3711
  • Thank you received: 984
  • Karma: 140
If you are such Reg Ex guru, and help here, you will be recognized as audibleid for its participation.
Thank you so much for editing a topic 20 times. Amazing.

Since the begining of the adventure I am amazed by this community and devotion for help.
Karma +2 hi hi.
Coding is now a piece of cake
The administrator has disabled public write access.
The following user(s) said Thank You: g1smd
Time to create page: 0.158 seconds

Get Started