我有前瞻断言(?=)的问题。例如,我有表达式:
/Win(?=2000)/
如果表达式类似于Win
,Win2000
,则匹配Win2000fgF
。我有下一个表达:
^(?=.*\d)(?=.*[a-z]).*$
匹配数字和小写字母,例如:45dF
,4Dd
。但我不知道,为什么它适用并匹配所有字符:)我没有字符,它们在(?=.*\d)
之前。我想,只有这个表达式应该有效:
^.\*(?=.*\d)(?=.*[a-z]).*$
(表达式前\*
)。
你能解释一下吗?
答案 0 :(得分:39)
假设我们是正则表达式引擎,并将正则表达式^(?=.*\d)(?=.*[a-z]).*$
应用于字符串2a
。
从第0位开始(在第一个字符之前):
^
:确保我们在字符串的开头:OK (?=
:让我们检查以下正则表达式是否匹配...... .*
:匹配任意数量的字符 - > 2a
。行。\d
:不,我们已经结束了。让我们回到一个角色:a
- >不,不匹配。返回另一个:2
- > MATCH!)
:前瞻结束,匹配成功。我们仍在位置0!(?=
:让我们检查以下正则表达式是否匹配...... .*
:匹配任意数量的字符 - > 2a
。行。[a-z]
:不,我们已经结束了。让我们回到一个角色:a
- > MATCH!)
:前瞻结束,匹配成功。我们仍在位置0!.*
:匹配任意数量的字符 - > 2a
- > MATCH!$
:让我们看看 - 我们在字符串的末尾吗?是的我们是! - > MATCH!答案 1 :(得分:4)
前瞻不匹配。
这意味着如果你使用前瞻,你需要一些将匹配你想要的东西。