I have a regex pattern to check for input phone number. Regex pattern is:
(@"((?:\(?[2-9](?(?=1)1[02-9]|(?(?=0)0[1-9]|\d{2}))\)?\D{0,3})(?:\(?[2-9](?(?=1)1[02-9]|\d{2})\)?\D{0,3})\d{4})"
This works fine for Server side validation and fails for client-side. I get the Invalid group error
.
I am fairly new to regex and by digging around I found out that it is because JS doesn't support lookbehind.
I tried to apply the - inversing the string technique but the pattern is too complicated. Could someone please help. Thanks in advance.
All your conditional constructs need to be replaced with a non-capturing group that contains a negative lookahead at the start. In general, it looks like
(?(?=0)01|\d{2}) = (?:(?=0)01|(?!0)\d{2})
That is, you convert a conditional group into a non-capturing group, and add restrictions to each alternative in the group. (?:(?=0)01|(?!0)\d{2})
matches 01
if the next char is 0
, else, if the next char is not 0
, match any two digits (but not if they start with 0
of course).
So, in your concrete case, change
(?(?=1)1[02-9]|(?(?=0)0[1-9]|\d{2}))
-> (?:(?=1)1[02-9]|(?:(?=0)0[1-9]|(?!0)\d{2}))
(?(?=1)1[02-9]|\d{2})
-> (?:(?=1)1[02-9]|(?!1)\d{2})
The exact JavaScript equivalent for the PCRE pattern is
((?:\(?[2-9](?:(?=1)1[02-9]|(?:(?=0)0[1-9]|(?!0)\d{2}))\)?\D{0,3})(?:\(?[2-9](?:(?=1)1[02-9]|(?!1)\d{2})\)?\D{0,3})\d{4})
See the regex demo .
However, some of the groupings are redundant, so you may shorten it to
\(?[2-9](?:(?=1)1[02-9]|(?:(?=0)0[1-9]|(?!0)\d{2}))\)?\D{0,3}\(?[2-9](?:(?=1)1[02-9]|(?!1)\d{2})\)?\D{0,3}\d{4}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.