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

时间:2016-07-07 08:24:57

标签: regex validation regex-lookarounds lookahead

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

$正在终止匹配。所以你基本上测试的是小写字符和数字(是好的)。由于预测的宽度为零,因此检查的当前位置不会发生变化(默认情况下由于^ 而在此处启动)。

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

这与您的要求相矛盾(因为已经存在小写字符和数字。因此字符串永远不会为空。这会导致正则表达式失败

你必须使用

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