正则表达式匹配电话号码模式的逻辑

3
我正在尝试创建一个正则表达式字符串来匹配电话号码,使用以下逻辑:
1) 对于NPA(区号),3个数字,第一个数字为[2-9],第二和第三位数字为[0-9]
2) 对于NXX(交换机 - 在NPA后的接下来的3个数字)与NPA相同规则。此外,如果第二个数字是“1”,则第三个数字不能为“1”(保留供公共服务使用)
3) 对于XXXX(号码 - 在NXX后的接下来的4个数字),每个数字为[0-9]
我已经完成了步骤1和3以及步骤2的一部分,使用以下字符串:
^\(?([2-9]{1})\)?([0-9]{2})?[-.*]?([2-9]{1})\)?([0-9]{2})?[-.*]?([0-9]{4})$

但我卡在了尝试将这里所述的逻辑合并到代码中:

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

如果有人能够帮助解决这个问题,那将不胜感激。

我想要我的正则表达式匹配结果为假,而继续匹配为真。它目前同时匹配两个集合。

假: 4807119320 4805119439 4809114739

真: 4805218482 4805123848 4809128327 4809418482


2
我认为如果您能在问题中添加一些应该和不应该匹配的示例,那会很有帮助。 - The fourth bird
抱歉,你是正确的,这里有两个例子。False 是我不想匹配的正则表达式,而 True 是我希望它继续匹配的。它目前匹配了两组数据。 False: 4807119320 4805119439 4809114739True: 4805218482 4805123848 4809128327 4809418482 - Branden
2个回答

1
如果第二部分的第二个数字是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就不会匹配:

正则表达式演示


1
谢谢,这就是我所缺少的。我知道我需要进行前瞻,但却不知道该怎么做。 - Branden

0

使用

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

问题已解决


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接