Javascript 正则表达式匹配有效电话号码
我对regex很陌生,不确定自己到底做错了什么 我正在寻找与以下数字格式匹配的正则表达式: 匹配要求:Javascript 正则表达式匹配有效电话号码,javascript,regex,Javascript,Regex,我对regex很陌生,不确定自己到底做错了什么 我正在寻找与以下数字格式匹配的正则表达式: 匹配要求: 必须以0或3开头 必须介于7到11位之间 不能允许升序数字。e、 g.012345678901234567 不得允许重复数字。e、 g.0111111133333000000000000 这就是我想到的: ^(?=(^[0,3]{1}))(?!.*(\d)\1{3,})(?!^(?:0(?=1|$))?(?:1(?=2|$))?(?:2(?=3|$))?(?:3(?=4|$))?(?:4(?=
^(?=(^[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 |$)|$)(?!(?)\k+$)[0-9]{6,10}$/
解释
^[03]
从字符串开头开始,然后读取0或3(?!123456(7(8(9 |$)|$)|$)
确保在第一个字符之后没有序列(如果可以读取序列,则反向前瞻失败)(?!(?)\k+$)
是另一种消极的前瞻:它确保第一个字符读取(标记为d)不会重复一次又一次,直到字符串结束[0-9]{6,10}$/
最后读取6到10位数字(第一位已经读取)- “0123456789:不匹配”
- “01234567:不匹配”
- “01234568:不匹配”
- “01111111:不匹配”
- “33333:不匹配”
- “333233是有效的”
- “042157891023有效”
- “019856:不匹配”
- “0123451245有效”
- JS风格的PCRE解决方案如下
/^[03](?!123456(7(8)(9 |$)|$)(?!(?)\k+$)[0-9]{6,10}$/
解释
^[03]
从字符串开头开始,然后读取0或3(?!123456(7(8(9 |$)|$)|$)
确保在第一个字符之后没有序列(如果可以读取序列,则反向前瞻失败)(?!(?)\k+$)
是另一种消极的前瞻:它确保第一个字符读取(标记为d)不会重复一次又一次,直到字符串结束[0-9]{6,10}$/
最后读取6到10位数字(第一位已经读取)- “0123456789:不匹配”
- “01234567:不匹配”
- “01234568:不匹配”
- “01111111:不匹配”
- “33333:不匹配”
- “333233是有效的”
- “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}$
关于您尝试的模式的一些注释
- 您可以省略
和{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}$
不要使用regex验证电话号码?不幸的是,使用regex是一项要求。该应用程序将在特定位置使用。@evolutionxboxI会质疑该要求。你的意思是这样的吗?
(*)(\d)\1)(?!(?)(?)(?:0(?=1$)(?:1(?=2(?=2$)(?:2(?=3(?=4(?=4(?=5$)(?:5(?=6$):1247$)(?)?(?:8(?=9 |$)?9?$)[03]\d{6,10}$
@Thefourthbird不幸的是,它与以下情况不匹配:022682673
不使用正则表达式验证电话号码?不幸的是,使用正则表达式是一项要求。应用程序将在特定位置使用。@evolutionxboxI会质疑该要求。您的意思是这样的吗?^(?!(!(?:0(?=1 |$)?(?:1(?=2 |$)?(?:2(?=3 |$)?(?:3(?=4 |$)?(?:4(?=5 |$)?(?:5(?=6 |$)?(?:6(?=7 |$)(?:7(?=8 |$)(?:8(?=9 |$)?9 |))[03]\d{6,10}$
@第四只鸟不幸的是,它与以下情况不匹配:022682673
我感谢你的帮助。但是为什么它接受023456789?对不起,我的错误。我的意思是不应该接受升序。例如:如果:012345678
,07123456
,07271234
,016385678
@JO,它应该拒绝JO这会起作用的,对吗?不会的,因为它只接受以02
开头的数字。记住,它必须以0或3开头,后面跟着任何东西。但是拒绝从数字的任何一点开始的升序。我感谢你的h