繁体   English   中英

正则表达式匹配有效电话号码

[英]Regex match valid Phone Number

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

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

匹配要求:

  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) 条条件。 不知道为什么。

任何帮助,将不胜感激。

谢谢

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 有效”

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

  • 您可以省略{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}$

正则表达式演示

或者省略第一个前瞻并将其移动到匹配项,将量词更改为\\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}$

正则表达式演示

编辑

根据评论,该字符串没有 4 个升序数字:

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

正则表达式演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM