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

Why my regex does not work when using beginning and end of string anchors?

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

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

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

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

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

$ 在这里结束比赛。因此,您基本上是在测试小写字符和数字( 可以)。由于前瞻的宽度为零,因此当前检查位置不会改变(由于^,这里默认处于开始位置)。

检查小写字母和数字后,基本上剩下 ^$ 匹配空字符串的正则表达式(记住匹配的位置没有改变 因为零宽度属性 前瞻).

这与您的要求矛盾(因为已经有一个小写字符和一个数字。所以字符串永远不能为空。这会导致正则表达式失败

你必须使用

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