2012-07-30 38 views
0

以下示例是關於使用前瞻性斷言作爲條件。我發現它在PHP手冊在:http://www.php.net/manual/en/regexp.reference.conditional.php正則表達式中的前瞻性,後視條件

(?(?=[^a-z]*[a-z]) 
\d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2}) 

這裏有一個關於這個表達式描述:

條件是匹配後面有一個字母的非字母任意序列的正預測先行斷言。換句話說,它測試主題中是否存在至少一個字母。如果找到一封信,則將該主題與第一個備選方案進行匹配;否則與第二個匹配。該模式匹配兩種形式之一的字符串dd-aaa-dd或dd-dd-dd,其中aaa是字母,dd是數字。

有誰能告訴我爲什麼我們在本例中使用lookahead斷言作爲條件嗎?爲什麼我們不使用lookbehind斷言?當我們將它們用作這樣的條件時,我感到困惑,因爲我不知道它們如何匹配主題字符串。提前致謝!

回答

1

在這種情況下,我們使用超前斷言來決定使用哪個正則表達式。它看起來像是在表格01-Jan-1201-01-12之間的匹配日期之間做出決定。前瞻斷言看看我們試圖匹配的內容中是否有任何字母,如果是,則使用\d{2}-[a-z]{3}-\d{2}嘗試匹配01-Jan-12,如果不是,則使用\d{2}-\d{2}-\d{2}嘗試匹配01-01-12

+0

你能否解釋我的第二個問題:爲什麼在這種情況下我們不使用lookbehind斷言? – 2012-07-30 12:41:20

+1

因爲我們想知道*事先*我們需要使用哪個正則表達式。如果我們在字符串的開始處使用lookbehind,則沒有任何匹配,並且在那之後我們丟失了一些我們想要匹配的數據。 – Gareth 2012-07-30 13:43:03

+0

感謝您的回答! – 2012-07-30 15:26:05