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,因此它无法匹配
    $