首先,我知道x(?=y)
仅在'x'
后跟'x'
时才匹配'y'
。
但是,当我尝试r'^(?=.*[0-9])(?=.*[a-z])'
时,
0a
和a0
都匹配?0a
,它匹配什么?
0
之前的空字符串匹配,则它将失败第二个条件(?=.*[a-z])
,因为0
之前的空字符串后跟0
,而不是{{1 }}。 a-z
相匹配,因为它后跟0
,则它应该失败第一个条件,因为a
不能跟0
。 ,对于[0-9]
,如果没有r'^(?=.*[0-9])(?=.*[a-z])$'
的上述情况有效,为什么不这样做?我不知道这匹配什么。似乎没有任何匹配。
非常感谢您的帮助。
答案 0 :(得分:5)
regex101.com具有一个正则表达式调试器,您可以使用它来查看正则表达式引擎的确切行为。
这里要注意的一个好点是,正则表达式中的匹配项始终为0长度,因为(?=)
不匹配任何内容。他们只是期待检查模式。
您可能知道,正则表达式引擎会在与字符匹配时从字符串的开头移动到字符串的结尾。
为什么0a匹配?
最初,引擎位于字符串的开头。它与“字符串开始”锚点^
相匹配。然后检查是否可以看到前瞻(?=.*[0-9])
中描述的模式。它可以?是。 .*
不能匹配任何内容,而[0-9]
可以匹配0
。然后,它检查第二次超前。请注意,发动机仍处于启动位置。它检查(?=.*[a-z])
。 .*
匹配0
,而[a-z]
匹配a
。两个前瞻匹配,因此^
保持匹配。
为什么a0匹配?
这与以前几乎相同。第一个前瞻:.*
匹配a
,而[0-9]
匹配0。第二个前瞻:.*
不匹配任何内容,[a-z]
匹配a
。 / p>
^(?=.*[0-9])(?=.*[a-z])$
为什么表现不同?
实际上,该正则表达式永远无法匹配。没有先行者,正则表达式将变为^$
。仅空字符串匹配^$
。而且空字符串不能包含字母和数字,因此前瞻将始终失败。