正则表达式 - 前瞻性断言

时间:2010-09-26 14:47:06

标签: regex regex-lookarounds

我有前瞻断言(?=)的问题。例如,我有表达式:

/Win(?=2000)/

如果表达式类似于WinWin2000,则匹配Win2000fgF。我有下一个表达:

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

匹配数字和小写字母,例如:45dF4Dd。但我不知道,为什么它适用并匹配所有字符:)我没有字符,它们在(?=.*\d)之前。我想,只有这个表达式应该有效:

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

(表达式前\*)。

你能解释一下吗?

2 个答案:

答案 0 :(得分: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. $:让我们看看 - 我们在字符串的末尾吗?是的我们是! - > MATCH!
  12. 嘿,我们已经到了正则表达式的末尾。大。比赛完成了!

答案 1 :(得分:4)

他们断言,

前瞻不匹配。

这意味着如果你使用前瞻,你需要一些匹配你想要的东西。