Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex-防止某些字符串匹配_Regex - Fatal编程技术网

Regex-防止某些字符串匹配

Regex-防止某些字符串匹配,regex,Regex,我在找一个银行账号。 它可以采用以下格式: 或或或 第一组(#######-)如果存在,可以有1-6个数字后跟-,并且不能全部为零。它可以匹配123456-,但不能000000- 第二组()可以有2-10个数字,必须有一个非零字符 我从这个正则表达式(\d{1,6}\-)?\d{2,10}开始。它应该匹配1。二,。第二排,不是第三排。四,。这个正则表达式匹配1。2.四,。我如何排除4.,即阻止匹配000000 100000-1234567890 1234567890 -1234567890

我在找一个银行账号。 它可以采用以下格式:

  • 第一组(
    #######-
    )如果存在,可以有1-6个数字后跟
    -
    ,并且不能全部为零。它可以匹配
    123456-
    ,但不能
    000000-
  • 第二组(
    )可以有2-10个数字,必须有一个非零字符
我从这个正则表达式
(\d{1,6}\-)?\d{2,10}
开始。它应该匹配1。二,。第二排,不是第三排。四,。这个正则表达式匹配1。2.四,。我如何排除4.,即阻止匹配
000000

  • 100000-1234567890
  • 1234567890
  • -1234567890
  • 000000-1234567890

  • 您可以使用具有负前瞻性的正则表达式,以确保起始处全为零的代码不匹配:

    ^(?:(?!0+-)\d{1,6}-)?(?=\d*[1-9])\d{2,10}$
    

    这里,

    • ^
      -匹配字符串的开头
    • (?:(?:)(?!0+-)\d{1,6}-?
      -仅当
      -
      之前的数字不是零时(由于
      (?:…)?
      构造),才可选地匹配1到6个数字(带有
      \d{1,6}
      ),后跟连字符(由于负前瞻
      (?!0+-)
    • (?=\d*[1-9])
      -第二组2到10位数字应至少有一个非零位
    • \d{2,10}
      -匹配后面跟
    • $
      -字符串结尾
    基本上,您只需要在正则表达式中添加两个内容:

    • 锚定(
      ^
      $
    • 展望未来

    您可以使用具有负前瞻性的正则表达式,以确保起始处全零的代码不匹配:

    ^(?:(?!0+-)\d{1,6}-)?(?=\d*[1-9])\d{2,10}$
    

    这里,

    • ^
      -匹配字符串的开头
    • (?:(?:)(?!0+-)\d{1,6}-?
      -仅当
      -
      之前的数字不是零时(由于
      (?:…)?
      构造),才可选地匹配1到6个数字(带有
      \d{1,6}
      ),后跟连字符(由于负前瞻
      (?!0+-)
    • (?=\d*[1-9])
      -第二组2到10位数字应至少有一个非零位
    • \d{2,10}
      -匹配后面跟
    • $
      -字符串结尾
    基本上,您只需要在正则表达式中添加两个内容:

    • 锚定(
      ^
      $
    • 展望未来

      • 斯特里比索的回答是“好的”。
        但是,如果您想通过“前瞻”来避免头痛,您只需使用以下方法:

        ^(?:[1-9](?:\d{1,5})?-)?\d{2,10}$
        
        在这里,我们只是禁止在第一组中使用首字母“0”,然后只允许使用其他5位数字


        .

        斯特里比索的答案是“好的”。
        但是,如果您想通过“前瞻”来避免头痛,您只需使用以下方法:

        ^(?:[1-9](?:\d{1,5})?-)?\d{2,10}$
        
        在这里,我们只是禁止在第一组中使用首字母“0”,然后只允许使用其他5位数字


        .

        谢谢。我尝试使用负前瞻,但没有成功。通过这个例子,我明白了。实际上,lookaheads是危险的,在大多数情况下,它们只与锚(
        ^
        /
        $
        \A
        /
        \Z
        /
        \Z
        )和单词边界(
        \b
        /
        \b
        )一起工作。很高兴能帮上忙。@sln击败了我,但从OP开始:“第二组(
        )(第二组)可以有2-10个数字,必须有一个非零字符”,所以您的正则表达式可能应该是
        ((?!0+-)\d{1,6}-(?:\d{2,10}-)(?),也就是说,它与之类的东西匹配好的,没有针对这个问题的测试用例,修复并添加了两个测试用例。谢谢。我尝试使用负向前看,但没有成功。通过这个例子我明白了。实际上,向前看是危险的,在大多数情况下,它们只与锚一起工作(
        ^
        /
        $
        \A
        /
        \Z
        /
        \Z
        )和单词边界(
        \b
        /
        \b
        )。很乐意帮忙。@sln击败了我,但从OP开始:“第二组(
        ###########
        )可以有2-10个数字,必须有一个非零字符”,所以也许你的正则表达式应该是
        ((?!0+)\d-){1,6-){-100000d:{-1000000,就像
        一样。(第二组全部为零)好的,没有测试用例,修复并添加了两个测试用例。我又添加了两个测试用例:
        100000-0000000000
        (不匹配)和
        100000-000000000 1
        (待匹配)。我又添加了两个测试用例:
        100000-0000000000
        (不匹配)和
        100000-000000000 1
        (待匹配)。