2012-08-29 150 views
8

我有我的正則表達式/'(.*)(?:(?:'\s*,\s*)|(?:'\)))/
和我的測試代碼('He said, "You're cool."' , 'Rawr')
(我的測試代碼會模擬參數傳遞給函數。)

我會解釋我的正則表達式按照我的理解,希望你們幾個可以闡明我的問題。

1)/'意味着在匹配字符串的開頭,需要有'

2)(.*)裝置捕獲的任何字符以外\n 0次或多次

3)(?:(?:4)|(?:5))裝置不捕獲但儘量執行步驟4,如果它不工作,嘗試第5步

4)(?:'\s*,\s*)手段不捕獲,但需要有一個' 0或多個空格字符,隨後是,有0個或多個空白字符

5)(?:'\))手段不捕獲,但需要有')

如此看來,它應該返回這個(這就是我想要的):
' + He said, "You're cool." + ' ,
但它返回:
' + He said, "You're cool."' , 'Rawr + ')

如果我改變我的測試代碼('He said, "You're cool."' , 'Rawr'(沒有結束括號),它返回我想要的東西,但只要我補充一點,最後一個小括號,然後好像是我的OR操作爲所欲爲就是了。如果有逗號,我希望它先測試,如果有逗號,並且如果沒有一個括號的檢查,那麼就打破它。

我試過切換第4步和第5步的點,但OR運算符似乎始終默認爲(?:'\))一側。 我怎樣才能匹配儘可能最短的金額?RegExp - 我怎樣才能匹配儘可能最短的金額?

+0

字符串的開頭將是'/ ^',而不是'/',fwiw。就我個人而言,我不相信我會使用正則表達式來表達你想要做的事情,而是一個小的解析器。令人困惑的正則表達式令人困惑。 –

+0

@DaveNewton - 是的,我知道。這就是爲什麼我在匹配的字符串開頭說的原因。也許我應該在字符串的匹配部分的開始處說。或者當它開始比賽時,它需要以''開始。 – Aust

回答

15

我不認爲你的問題是OR運算符,而是greediness.*。它會匹配你的完整字符串,然後返回 -track直到下列表達式匹配。在這個回溯過程中的第一場比賽將是'He said, "You're cool."' , 'Rawr + ')。改爲嘗試.*?

+1

Bergi你是個天才!這是完美的。 :)你介意解釋一下爲什麼這有效嗎?沒關係,我從你的鏈接中瞭解到。再次感謝。 :) – Aust

+0

您可能想閱讀http://stackoverflow.com/a/5319978/1048572 – Bergi