2010-09-26 46 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不匹配,他們斷言。

這意味着如果您使用向前看,您需要的東西匹配你想要的東西,如果你想進一步。