正则表达式中的电话号码验证

时间:2019-04-09 06:19:01

标签: regex

如果我有很多电话号码,例如

123-456-7890
(111-111-1111
111)-111-1111
(123)-456-7890

我只想匹配1号和4号,我的模式只能匹配4号,而且if条件似乎不起作用。

(\()(\d+)(?(1)\)\-|\-)(\d+\-\d+)

正则表达式网站中的所有解决方案都无法识别单个括号。

2 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式,该表达式匹配任意一种情况,并带有括号,也可以不带括号,使用替换,

^(?:\(\d+\)|\d+)-\d+-\d+$

还要使用开始/结束^ / $锚来确保正则表达式不允许部分匹配。

Regex Demo 1

如果要完全匹配样本中的位数,可以使量词更具体,并使用此正则表达式,

^(?:\(\d{3}\)|\d{3})-\d{3}-\d{4}$

Regex Demo 2

编辑:在正则表达式中使用If Clause的OP的正则表达式的说明和更正

在正则表达式中,您需要通过将?放在group1之后来将group1设为可选

(\()(\d+)(?(1)\)\-|\-)(\d+\-\d+)
^^^^ This is mandatory which stops it to match a number that doesn't have ( in start

因此您的正则表达式的正确版本应该是

^(\()?(\d+)(?(1)\)\-|\-)(\d+\-\d+)$
     ^ You need to add this to make group1 optional so it can match a number without `(`

此外,如您所见,我使用了^$,因此正则表达式不允许数字中的部分匹配。

Check this demo with your own updated regex, which works like you expected

答案 1 :(得分:0)

尝试^(?(?=\()\(\d{3}\)|\d{3})-\d{3}-\d{4}$

Demo

说明:

^-字符串的开头

(?(?=\()\(\d{3}\)|\d{3})-条件表达式:如果正向预报(?=\()成功(紧随其后的是括号(),则匹配\(\d{3}\)-括号之间的三位数,否则,匹配\d{3}-三位数

-\d{3}-\d{4}-匹配连字符,三位数,连字符和四位数

$-字符串结尾