2012-01-24 80 views
0

我遇到了很多麻煩寫這個正則表達式:無限量詞回顧後

(?<=\s+|^\s*|\(\s*|\.)(?:item|item1|item2)(?=\s+|\s*$|\s*\)|\.) 

它非常好對我正則表達式編輯器(快報),並在.NET環境中,但在Java環境(使用Eclipse Helios R2的JRE 1.6.0.25)不起作用,因爲Pattern.compile()方法會引發「語法錯誤U_REGEX_LOOK_BEHIND_LIMIT」異常。

這是因爲模式(?<=\s+|^\s*|\(\s*|\.)後面的外觀必須有一個定義的限制(無限量詞如*+在這裏是不允許的,據我所知)。

我也試過,沒有運氣指定這樣重複的範圍:

(?<=\s{0,1000}|^\s{0,1000}|\(\s{0,1000}|\.)(?:item|item1|item2)(?=\s+|\s*$|\s*\)|\.) 

所以,我怎麼能寫的作品甚至在Java環境相同的正則表達式? 我不敢相信這種常見的情況沒有解決方法....

回答

2

請記住,後視只會看起來遠遠落後,因爲它必須。例如,如果前一個字符是空格,則將滿足(?<=\s+);它不需要看得更遠。

你的後顧之道也是如此。如果它不是字符串的開始,並且前一個字符不是空格,開放括號或句點,那麼再往後看就沒有意義了。它相當於這個:

(?<=^|[\s(.]) 

你的lookahead可以以同樣的方式濃縮。如果它不是字符串的結束,下一個字符不是空白,近距離括號或一段時間,有沒有一點尋找任何進一步的:

(?=[\s).]|$) 

所以最終的正則表達式是:

(?<=^|[\s(.])(?:item|item1|item2)(?=[\s).]|$) 
+0

非常感謝您的幫助!我試過你的正則表達式,它似乎很好!我必須改變我的方法,並在編寫lookaround正則表達式代碼時付出更多注意力......您的幫助非常有用! – GiveEmTheBoot