I have a regex to check phone numbers in a text. Please check below.
(\d[\s-]?)?[\(\[\s-]{0,2}?\d{3}[\)\]\s-]{0,2}?\d{3}[\s-]?\d{4}
This regex works fine but it does not work well if I write it this way.
- Ex 1: 088 11 22 458
- Ex 2: 1 88 11 22 458
How can I modify the regex to fix this bug?
CodePudding user response:
You can add an optional
at the start, allow two or three digits in the area code and add an alternative to match two double digits and then a chunk of three digits in the end:
(?:\ ?\d[\s-]?)?[([\s-]{0,2}\d{2,3}[)\]\s-]{0,2}(?:\d{3}[\s-]?\d{4}|\d{2}[\s-]?\d{2}[\s-]?\d{3})
See the regex demo. Details:
(?:\ ?\d[\s-]?)?
- an optional occurrence of an optional[([\s-]{0,2}
- zero, one or two(
,[
, whitespace or hyphen chars\d{2,3}
- two or three digits[)\]\s-]{0,2}
- zero, one or two)
,]
, whitespace or hyphen chars(?:\d{3}[\s-]?\d{4}|\d{2}[\s-]?\d{2}[\s-]?\d{3})
- either of\d{3}[\s-]?\d{4}
- three digits, an optional whitespace or-
, four digits|
- or\d{2}[\s-]?\d{2}[\s-]?\d{3}
- two digits, an optional whitespace or-
, two digits, an optional whitespace or-
, three digits
You might also think of adding numeric boundaries to disallow matches that have other digits on the left (with the negative (?<!\d)
lookbehind) and right (with the negative (?!\d)
lookahead):
(?:\ ?(?<!\d)\d[\s-]?)?[([\s-]{0,2}(?<!\d)\d{2,3}[)\]\s-]{0,2}(?:\d{3}[\s-]?\d{4}|\d{2}[\s-]?\d{2}[\s-]?\d{3})(?!\d)
See this regex demo.
CodePudding user response:
I would use this regex:
[\ \(\[]?\d[\(\[\s-]?\d[\s-]?\d[\)\]\s-]?\d[\s-]?\d[\s-]?\d[\s-]?\d[\s-]?\d[\s-]?\d[\s-]?\d
It allows to use delimiters in any place. Sometimes phone numbers are delimiter so that it will be easier to remember them.
For example:
- 088 111-2-111
- (088)11-22-33-4