2011-11-18 51 views
5

我想了解更多關於正則表達式的知識。正則表達式:如何在模式的結果上使用lookahead/lookbehind?

我只是試圖匹配沒有被方括號包圍的訂單號(#1234但不是[#1234]),但我的問題更多地是關於在任意模式中使用lookahead斷言。

在我第一次嘗試時,我注意到我的負面超前比賽\d+(?!\])將導致\d+保持匹配的數字,直到它沒有跟隨]。只有在整體沒有跟隨]後,我才需要數字匹配。

我目前的解決方案通過展望數字鏈中是否存在]來殺死第一位數字的匹配。

這是一個標準的方式來解決這個問題嗎?我只是在前瞻中重複比賽模式。如果這是一個更復雜的正則表達式,我會採用相同的方法嗎?重複有效匹配,然後是無效匹配,並讓正則表達式引擎爲每個字母重複一遍?

對於有效的匹配,它必須與匹配中的字符匹配多次。

(?<!\[) # not preceded by [ 
#\d+ 
(?!\d*\]) # not followed zero+ digits and ] 

# or (?!\d|\]) # not followed by digit or ] 

我會很感激任何反饋!

+0

不知道你的」 ......只有在全部後面沒有什麼意思一個 ]」。你能否添加一個沒有得到你想要的匹配的字符串的例子,以及在這種情況下匹配應該是什麼? – Faust

+0

@Faust:我得到了我想要的比賽,我只是覺得我的方法不太好。 Narendra Yadala指出我需要準確防止回溯。謝謝全部 –

回答

8

你可以實現你想要的使用所有格量詞與lookarounds沿着這樣

(?<!\[)#\d++(?!\]) 

你的情況的問題是,當你使用\d+它允許回溯和結束有部分匹配#123。一旦您將其改爲佔有量詞,它將不會回溯,並且只有在數字序列沒有前後括號的情況下才會匹配。

Live Demo

編輯 如果佔有慾量詞不支持,你可以使用這個

#\d(?<!\[#\d)(?!\d*\])\d* 
+0

輝煌! '不像一個貪婪的量詞,它不會像引擎回溯一樣放棄匹配。用佔有量詞,交易是全部或沒有。 「這正是我需要的。我很高興我問了這個問題:)我會盡快接受。 –

+0

哎呀,剛剛發現蟒蛇重新不支持它......可能會使用我原來的功能,然後:( –

+0

@ YujiTomita增加了一個正則表達式,它將在不支持所有格量​​詞時起作用 –