2010-09-26 45 views
9

我有问题,看起来断言(?=)。例如,我有表达:正则表达式 - lookahead断言

/Win(?=2000)/ 

它匹配Win,如果表达式类似Win2000Win2000fgF。我有下一个表达式:

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

它匹配位数和小写字母,例如:45dF4Dd。但我不知道,为什么它的作品和匹配所有字符:)我没有字符,这是在(?=.*\d)之前。我认为,只有这种表达应该工作:

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

(与\*表达之前)。

你能解释一下吗?

回答

38

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

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

  1. ^:确保我们在该字符串的开头:OK
  2. (?=:让我们来看看,如果下面的正则表达式可以匹配。 ..
  3. .*:匹配任意数量的字符 - >2a。好。
  4. \d:不,我们已经结束了。让我们回到一个字符:a - >不,不匹配。返回另一个:2 - >匹配!
  5. ):超前结束,比赛成功。我们是仍在位置0!
  6. (?=:让我们来看看,如果下面的正则表达式可以匹配...
  7. .*:匹配任何数目的字符 - >2a。好。
  8. [a-z]:不,我们已经结束了。让我们回到一个字符:a - >匹配!
  9. ):超前结束,比赛成功。我们是仍在位置0!
  10. .*:匹配任意数量的字符 - >2a - >匹配!
  11. $:让我们来看看 - 我们在字符串的末尾?是的我们是! - >匹配!
  12. 嘿,我们已经达到了正则表达式的末尾。大。比赛完成!
+0

感谢您的好解释。你能告诉我,为什么^(?=。* \ d)(?=。* [a-z])$(最后没有。*)不适用于2a?这个正则表达式应该匹配吗? – luk4443 2010-09-26 16:12:20

+4

好吧,想象你离开第10步 - 正则表达式引擎仍处于位置0,所以它无法匹配'$'。 – 2010-09-26 16:17:57

+0

好的,谢谢:) – luk4443 2010-09-26 16:49:01

3

lookaheads不匹配,他们断言。

这意味着如果您使用向前看,您需要的东西匹配你想要的东西,如果你想进一步。