正则表达式以匹配电话模式逻辑

时间:2019-05-31 19:59:08

标签: regex

我正在尝试使用以下逻辑创建一个正则表达式字符串以匹配电话号码:

1)对于NPA(区号),3位数字,第一位是[2-9],第二位和第三位是[0-9]

2)对于NXX(交换-NPA之后的3位数字),其规则与NPA相同。此外,如果第二位数字为“ 1”(保留用于公共服务),则第三位数字不能为“ 1”

3)对于XXXX(数字– NXX之后的后4位数字),请为[0-9]分别输入4位数字。

我已经使用以下字符串完成了步骤1和3,以及步骤2的一部分:

^\(?([2-9]{1})\)?([0-9]{2})?[-.*]?([2-9]{1})\)?([0-9]{2})?[-.*]?([0-9]{4})$

但是我一直坚持尝试结合此处所述的逻辑:

对于NXX(交换-NPA后的下3位数字)与NPA相同。此外,如果第二位数字为“ 1”(保留用于公共服务),则第三位数字不能为“ 1”

如果有人可以对此有所帮助,将不胜感激。

False是我希望我的正则表达式不匹配的内容,而true是我希望它继续匹配的内容。当前它与两个集合都匹配。

否:4807119320 4805119439 4809114739

是的:4805218482 4805123848 4809128327 4809418482

2 个答案:

答案 0 :(得分:2)

如果在第二部分中第二个数字不能为1,而在第三部分中则为1,则可以使用负前瞻(?!11)来断言右边的不是11。

将其添加到您的模式中,如下所示:

^\(?([2-9])\)?([0-9]{2})?[-.*]?([2-9])\)?((?!11)[0-9]{2})?[-.*]?([0-9]{4})$
                                          ^^^^^^ 

Regex demo

请注意,由于\(?\)?之类的问号,很多部分是可选的,而第二个右括号中缺少开头括号,因此这会也匹配(2)33-2)21-2222

如果第二部分的开头和结尾括号与第一部分相同,则可能看起来像这样:

^\(?([2-9])\)?([0-9]{2})?[-.*]?\(?([2-9])\)?((?!11)[0-9]{2})?[-.*]?([0-9]{4})$
                               ^^^ 

如果第一个字符类中的匹配项与第二个字符类中的匹配项相同,则您可能还会使用另一个捕获组([-.*]?)和一个反向引用\3,因此(2)33-(2)212222将不匹配:

Regex demo

答案 1 :(得分:0)

使用

  

^(?([2-9]))?([0-9] {2})?[-。]?([2-9]))?((?! 11)[ 0-9] {2})?[-。]?([0-9] {4})$

解决了我的问题