Regex-lookahead断言
我对先行断言有问题(?=)。例如,我有一个表达式:Regex-lookahead断言,regex,regex-lookarounds,Regex,Regex Lookarounds,我对先行断言有问题(?=)。例如,我有一个表达式: /Win(?=2000)/ ^(?=.*\d)(?=.*[a-z]).*$ 如果表达式类似于Win2000,Win2000fgF,则匹配Win。我有下一个表达: /Win(?=2000)/ ^(?=.*\d)(?=.*[a-z]).*$ 它匹配数字和小写字母,例如:45dF,4Dd。但我不知道,为什么它可以工作并匹配所有字符:)我没有字符,它们在(?=.*\d)之前。我认为,只有这个表达应该起作用: ^.\*(?=.*\d)(?=.*[
/Win(?=2000)/
^(?=.*\d)(?=.*[a-z]).*$
如果表达式类似于Win2000
,Win2000fgF
,则匹配Win
。我有下一个表达:
/Win(?=2000)/
^(?=.*\d)(?=.*[a-z]).*$
它匹配数字和小写字母,例如:45dF
,4Dd
。但我不知道,为什么它可以工作并匹配所有字符:)我没有字符,它们在(?=.*\d)
之前。我认为,只有这个表达应该起作用:
^.\*(?=.*\d)(?=.*[a-z]).*$
(在表达式之前使用\*
)
你能解释一下吗?他们断言,长相不匹配
这意味着,如果您使用前瞻,那么如果您想更进一步,您需要与您想要的内容相匹配的内容。假设我们是正则表达式引擎,并将正则表达式
^(?=.*\d)(?=.[a-z]).$
应用于字符串2a
从位置0(第一个字符之前)开始:
^
:确保我们位于字符串的开头:OK(?=
:让我们检查以下正则表达式是否匹配*
:匹配任意数量的字符->2a
。确定\d
:不,我们已经结束了。让我们返回一个字符:a
-->不匹配。返回另一个:2
-->匹配)
:前瞻结束,匹配成功。我们还在0号位置李>
(?=
:让我们检查以下正则表达式是否匹配*
:匹配任意数量的字符->2a
。确定[a-z]
:不,我们已经到了结尾。让我们回到一个字符:a
-->匹配)
:前瞻结束,匹配成功。我们还在0号位置李>
*
:匹配任意数量的字符->2a
-->匹配李>
$
:让我们看看-我们是在字符串的末尾吗?是的,我们是比赛李>
谢谢你的解释。你能告诉我,为什么^(?=.*\d)(?=.[a-z])$(结尾没有。*)对2a不起作用吗?这个正则表达式应该匹配?好吧,假设您省略了步骤10-正则表达式引擎仍然处于位置0,因此它无法匹配
$
。