9

我对前瞻断言 (?=) 有疑问。例如,我有表达:

/Win(?=2000)/

它匹配Win, 如果表达式是Win2000, Win2000fgF。我有下一个表达:

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

它匹配数字和小写字母,例如:45dF, 4Dd. 但我不知道,为什么它可以工作并匹配所有字符:) 我没有字符,它们是 before (?=.*\d)。我认为,只有这个表达式应该有效:

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

(与\*之前的表达)。

你能解释一下吗?

4

2 回答 2

39

假设我们是正则表达式引擎并将正则表达式^(?=.*\d)(?=.*[a-z]).*$应用于字符串2a

从位置 0 开始(在第一个字符之前):

  1. ^:确保我们在字符串的开头:OK
  2. (?=:让我们检查以下正则表达式是否可以匹配...
  3. .*: 匹配任意数量的字符 -> 2a。好的。
  4. \d: 不,我们已经结束了。让我们返回一个字符:a--> 不,不匹配。返回另一个:2--> MATCH!
  5. ): 前瞻结束,匹配成功。我们还在0号位!
  6. (?=:让我们检查以下正则表达式是否可以匹配...
  7. .*: 匹配任意数量的字符 -> 2a。好的。
  8. [a-z]: 不,我们已经结束了。让我们返回一个字符:a--> MATCH!
  9. ): 前瞻结束,匹配成功。我们还在0号位!
  10. .*: 匹配任意数量的字符 -> 2a--> MATCH!
  11. $: 让我们看看 - 我们在字符串的末尾吗?是的,我们是的!--> 匹配!
  12. 嘿,我们已经到了正则表达式的末尾。伟大的。比赛完成!
于 2010-09-26T15:27:13.030 回答
4

他们断言,前瞻不匹配。

这意味着如果您使用前瞻,如果您想走得更远,您需要与您想要的东西相匹配的东西

于 2010-09-26T14:48:06.150 回答