【问题标题】:Regex match valid Phone Number正则表达式匹配有效的电话号码
【发布时间】:2020-02-26 00:56:31
【问题描述】:

我对正则表达式很陌生,不确定我到底做错了什么。

我正在寻找符合以下数字格式的正则表达式:

匹配要求:

  1. 必须以 0 或 3 开头
  2. 必须介于 7 到 11 位数字之间
  3. 不得允许升序数字。例如0123456789, 01234567
  4. 不得允许重复数字。例如011111111, 3333333333, 0000000000

这是我想出的:

^(?=(^[0,3]{1}))(?!.*(\d)\1{3,})(?!^(?:0(?=1|$))?(?:1(?=2|$))?(?:2(?=3|$))?(?:3(?=4|$))?(?:4(?=5|$))?(?:5(?=6|$))?(?:6(?=7|$))?(?:7(?=8|$))?(?:8(?=9|$))?9?$).{7,11}$

上述正则表达式不符合第 (4) 号条件。不知道为什么。

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 不要使用正则表达式来验证电话号码? stackoverflow.com/a/4338544/989920
  • 不幸的是,它要求使用正则表达式。该应用程序将在特定位置使用。 @evolutionxbox
  • 我会质疑这个要求。
  • 你是这个意思吗? ^(?!.*(\d)\1)(?!(?:0(?=1|$))?(?:1(?=2|$))?(?:2(?=3|$))?(?:3(?=4|$))?(?:4(?=5|$))?(?:5(?=6|$))?(?:6(?=7|$))?(?:7(?=8|$))?(?:8(?=9|$))?9?$)[03]\d{6,10}$regex101.com/r/4EWkQJ/1
  • @Thefourthbird 不幸的是,它与以下情况不匹配:022682673

标签: javascript regex


【解决方案1】:

关于您尝试的模式的一些说明

  • 您可以省略{1} 和[0,3] 中的逗号
  • 在前瞻(?!.*(\d)\1{3,}) 中,(\d) 是第二个捕获组,因为这个(?=(^[0,3]{1})) 包含第一个捕获组,所以它应该是\2 而不是\1
  • 在前瞻中,您可以省略{3,} 中的逗号
  • 在匹配本身中,您使用.{7,11},其中的点将匹配除换行符以外的任何字符。您可以使用 \d 来仅匹配数字

你的模式可能看起来像

^(?=(^[03]))(?!.*(\d)\2{3})(?!^(?:0(?=1|$))?(?:1(?=2|$))?(?:2(?=3|$))?(?:3(?=4|$))?(?:4(?=5|$))?(?:5(?=6|$))?(?:6(?=7|$))?(?:7(?=8|$))?(?:8(?=9|$))?9?$)\d{7,11}$

Regex demo

或者省略第一个前瞻并将其移至匹配项,将量词更改为 \d{6,10} 并重复捕获组 \1 而不是 \2

^(?!.*(\d)\1{3})(?!(?:0(?=1|$))?(?:1(?=2|$))?(?:2(?=3|$))?(?:3(?=4|$))?(?:4(?=5|$))?(?:5(?=6|$))?(?:6(?=7|$))?(?:7(?=8|$))?(?:8(?=9|$))?9?$)[03]\d{6,10}$

Regex demo

编辑

根据 cmets,字符串不包含 4 个升序:

^(?!.*(\d)\1{3})[03](?!\d*(?:0123|1234|2345|3456|4567|5678|6789))\d{6,10}$

Regex demo

【讨论】:

  • 感谢您的帮助。但是为什么它接受 023456789?
  • 对不起我的错误。我的意思是不应该接受升序
  • 例如:如果:012345678,07123456,07271234,016385678,它应该拒绝
  • @JOJO 这样就可以了,对吧? regex101.com/r/yhmwll/1
  • 不会,因为它只接受以02开头的数字。请记住,它必须以 0 或 3 开头,然后是任何内容。但拒绝从数字的任何一点升序
【解决方案2】:

一个 JS 风格的 PCRE 解决方案是

/^[03](?!123456(7(8(9|$)|$)|$))(?!(?<d>.)\k<d>+$)[0-9]{6,10}$/

解释

  1. ^[03] 从字符串的开头开始,然后读取 0 或 3
  2. (?!123456(7(8(9|$)|$)|$)) 确保在第一个字符之后没有序列(如果可以读取序列,则否定前瞻失败
  3. (?!(?<d>.)\k<d>+$) 是另一个否定的前瞻:它确保读取的第一个字符(标记为 d)不会一次又一次地重复,直到字符串结束
  4. [0-9]{6,10}$/终于读到了6到10位(第一个已经读过了)

一些测试:

  • “0123456789:不匹配”
  • “01234567:不匹配”
  • “01234568:不匹配”
  • “011111111:不匹配”
  • “33333333:不匹配”
  • “333333233 有效”
  • “042157891023 有效”
  • “019856:不匹配”
  • “0123451245 有效”

【讨论】:

  • 欣赏答案,但为什么接受 023456789?
  • 因为序列应该是 0123456789。没有 1 会有 0 和 2 之间的跳跃,因此它不是一个序列,是吗?
猜你喜欢
  • 2010-12-16
  • 2020-01-18
  • 2011-01-08
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
相关资源
最近更新 更多