我试图使用以下逻辑创建一个regex字符串来匹配电话号码:
1) NPA (区号)为3位,第1位为2-9,第2位和第3位为0-9。
2)对于NXX ( NPA之后的下一个3位数字),与NPA相同的规则。此外,如果第二位数字为“1”(为公共服务保留),则第三位数字不能为“1”。
3)对于XXXX (NXX之后的数字-下4位数字),4位数字中的每一位都为0-9位。
我使用以下字符串完成了步骤1和步骤3以及步骤2的一部分:
^\(?([2-9]{1})\)?([0-9]{2})?[-.*]?([2-9]{1})\)?([0-9]{2})?[-.*]?([0-9]{4})$但我坚持要把这里所述的逻辑结合起来:
对于NXX (exchange - NPA之后的下3位数字),与NPA相同的规则。此外,如果第二位数字为“1”(为公共服务保留),则第三位数字不能为“1”。
如果有人能帮我照亮这一点,我们将不胜感激。
错误是我希望我的正则表达式不匹配的,而真是我希望它继续匹配的东西。它目前匹配这两组。
假:4807119320 4805119439 4809114739
真:4805218482 4805123848 4809128327 4809418482
发布于 2019-05-31 20:51:03
如果在第二部分中,如果第三位数为1,则第二位数不能为1,则可以使用负前瞻性(?!11)断言右边的值不是11。
如果将其添加到您的模式中,它将看起来如下:
^\(?([2-9])\)?([0-9]{2})?[-.*]?([2-9])\)?((?!11)[0-9]{2})?[-.*]?([0-9]{4})$
^^^^^^ 注意到,由于问号(如\(?和\)? ),许多部件都是可选的;对于第二个结束括号,缺少一个开头括号,因此这也将与(2)33-2)21-2222匹配。
如果第二部分的开头和结尾括号应该与第一部分相同,它可能如下所示:
^\(?([2-9])\)?([0-9]{2})?[-.*]?\(?([2-9])\)?((?!11)[0-9]{2})?[-.*]?([0-9]{4})$
^^^ 如果第一个字符类中的匹配项应该与第二个字符类中的匹配项相同,则还可以使用另一个捕获组([-.*]?)和反向引用\3,这样(2)33-(2)212222就不会匹配:
发布于 2019-06-01 01:09:09
使用
^(?(2-9))?(0-9{2})?-._?(2-9))?((?!11)0-9{2})?-._?(0-9{4})$
解决了我的问题
https://stackoverflow.com/questions/56401070
复制相似问题