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

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(?=

我对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(?=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