【问题标题】:Regex to match Telephone Pattern logic正则表达式匹配电话模式逻辑
【发布时间】:2019-05-31 19:59:08
【问题描述】:

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

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

2) 对于 NXX(交换 – NPA 之后的 3 位数字),规则与 NPA 相同。另外,如果第 2 位为“1”,则第 3 位不能为“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(交换 - NPA 之后的下 3 位数字),规则与 NPA 相同。另外,如果第 2 位为“1”,则第 3 位不能为“1”(为公共服务保留)

如果有人可以帮助阐明这一点,将不胜感激。

False 是我希望我的正则表达式不匹配的内容,而 true 是我希望它继续匹配的内容。它目前匹配两组。

错误:4807119320 4805119439 4809114739

正确:4805218482 4805123848 4809128327 4809418482

【问题讨论】:

  • 我认为如果你能在你的问题中添加一些应该和不应该匹配的例子会有所帮助。
  • 我很抱歉,你是对的,所以这里有两个例子。 False 是我希望我的正则表达式不匹配的内容,而 true 是我希望它继续匹配的内容。它目前匹配两组。错误:4807119320 4805119439 4809114739 正确:4805218482 4805123848 4809128327 4809418482

标签: regex


【解决方案1】:

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

将它添加到您的模式中,它看起来像:

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

Regex demo

请注意,由于\(?\)? 等问号,很多部分是可选的,而第二个右括号缺少一个左括号,因此这也将匹配@987654327 @

如果第二部分的左括号和右括号应该与第一部分相同,则可能如下所示:

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

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

Regex demo

【讨论】:

  • 谢谢,这就是我所缺少的。我知道我需要向前看,只是被困在做什么。
【解决方案2】:

使用

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

解决了我的问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多