2011-02-10 20 views
5

好吧,所以我正在開發一個項目,我需要一個正則表達式,它可以匹配一個*後跟1-4個空格或製表符,然後是一行文本。現在,我正在使用。*在lookbehind之後進行測試。不過,我可以明確地匹配1,2或4個空格/製表符,但不是1-4。我測試針對以下塊量詞範圍不能在逆序工作

* test line here 
* Second test 
* Third test 
* Another test 

而且這是兩個模式我測試(?<=(\*[ \t]{3})).*其作品一樣預期,2號線一致,相同的,如果我更換3與1,2或4但是如果我將它替換爲1,4形成以下模式(?<=(\*[ \t]{1,4})).*它不再匹配任何行,並且我真的不明白爲什麼。我試過Google搜索沒有成功。我正在使用g(lobal)標誌。

回答

5

與許多風格一樣,PHP不支持可變長度lookbehind。唯一的支持是替換|)在向後看的頂層。即使是?也可以打破這種模式。另一種方法是使用:

(?<=\*[ \t]|\*[ \t]{2}|\*[ \t]{3}|\*[ \t]{4}).* 

或者更好的,中止回顧後一組:

\*[ \t]{1,4}(.*) 

這應該爲你工作好,因爲它似乎並不像你有你的重疊比賽無論如何。

從手冊:

向後斷言的內容被限制,使得所有它匹配的字符串必須有一個固定的長度。但是,如果有多種選擇,它們並不一定都具有相同的固定長度。因此(?< =牛驢)是允許的,但是(?<!狗?|貓?)在編譯時會導致錯誤。匹配不同長度字符串的分支只能在lookbehind斷言的頂層使用。

來源:http://www.php.net/manual/en/regexp.reference.assertions.php

+1

它也可能是值得一提的是,正則表達式仍然不會做什麼的OP可能希望 - 它會很高興地匹配多於4個空格,因爲`*`將匹配空間就好了。 – 2011-02-10 11:53:35