代码之家  ›  专栏  ›  技术社区  ›  Piotr Berebecki

为什么我的正则表达式在使用字符串开头和结尾锚定时不起作用?

  •  1
  • Piotr Berebecki  · 技术社区  · 8 年前

    我开发了以下正则表达式,试图用至少一个数字和至少一个小写字符来匹配字符串。

    (?=.*[a-z])(?=.*\d)
    

    这似乎工作正常。例如,它匹配“abc3”而不是“abc”

    但是,只要我通过添加字符串锚点的开头和结尾来修改正则表达式,它就会停止工作。你知道为什么吗?

    ^(?=.*[a-z])(?=.*\d)$
    
    1 回复  |  直到 8 年前
        1
  •  3
  •   rock321987    8 年前

    $ 正在此处终止匹配。所以你基本上是在测试一个小写字符和一个数字( 哪一个可以 ). 由于lookahead的宽度为零,所以检查的当前位置不变( 默认情况下,这是因为 ^ ).

    检查小写和数字后,基本上只剩下 ^$ 匹配空字符串的regex( 记住匹配的位置没有改变 因为lookahead的零宽度特性 ).

    )

    你必须使用

    ^(?=.*[a-z])(?=.*\d).*$