2011-11-30 40 views
2

我想寫一個條件正則表達式,匹配2個模式中的1個。從條件REGEX獲取捕獲組

爲了做到這一點,我有一個簡單的條件:

/((pattern1)|(pattern2))/gi

問題是,模式1中,我可以擁有多個採集組 - 可以說,他們的3,而模式2中,我有5個其中。

如何判斷兩個模式匹配的哪一個?我需要能夠爲我的輸出請求正確的捕獲組(按編號)。

我想我的例子中,你可以檢查任何捕獲組值超過3的存在,但說我有每個模式中等量的捕獲組。我在想一定有一種很好的方式來做到這一點 - 我使用PHP或JavaScript。讓我知道是否需要更多細節。

在此先感謝!

+1

爲什麼不只是使用兩個正則表達式= D – Esailija

+0

這不是一個有條件的,而是一個交替。 –

回答

3

模式根據正則表達式本身進行編號,而不是根據實際匹配的結果進行編號。在你的例子中,總體組將總是組1,那麼第一種可能性(「模式1」)將是組2,而另一組將是組3.如果「模式2」匹配,則組3將是非空的並且換句話說,組2將是空的。第1組將始終與第2組和第3組中的非空組相同。

+0

啊,所以你在說理論上,pattern1總是包含捕獲組2,3和4,而pattern2將總是包含5,6和7組,只是基於我如何編寫正則表達式? – tresstylez

+0

是的。我一直在做的是通過正則表達式左側paren的位置來計算組。 (我不是100%肯定這是嚴格正確的,但我不寫太多超複雜的正則表達式。)因此,最左邊的「(」是組1,然後是下一個「(」是組2, – Pointy

+0

是的,這是規則:開放paren的相對位置決定了組號,但是可以在某些口味中覆蓋該行爲,例如使用[sln]分支重置組http://stackoverflow.com/a/8333398/20938)使用。 –

0

(pattern1)匹配[1]如果匹配,匹配[1]如果匹配則匹配undefined。如果存在,(pattern2)將匹配[2],否則匹配undefined

匹配數組是從正則表達式本身定義的,而不考慮實際匹配的內容。那些沒有得到匹配的東西在數組中是未定義的。

在此代碼:

var re = /(patt)(ern1)|(pat)(tern2)/i; 
var str = "this is pattern1 and some more text"; 

var matches = str.match(re); 

你得到一個匹配陣列五個條目。

matches[0] === "pattern1" 
matches[1] === "patt" 
matches[2] === "ern1" 
matches[3] === undefined 
matches[4] === undefined 
matches.length === 5 

注意,這隻適用於如果你刪除外部捕獲parens和你的匹配模式中的「g」標誌。

0

我想推薦出你想在Firefox中像螢火控制檯找到這樣的內容:

'mystring'.replace(/myregex/gi, function() { 
    console.info(arguments); 
}); 

這樣你就可以做一些試驗和錯誤,看看正則表達式的作品。但要注意的是:RegExp在各種情況下都不能使用相同的跨瀏覽器。

0

我怎麼能告訴WHICH的兩個模式匹配?我需要能夠爲我的輸出請求正確的捕獲組(按編號)。」

如果你不知道的任何分組中的每個圖案

(?|(pattern1)|(pattern2))

可以讓你在第1組開始索引。
但是,哪種模式的意義可能仍然是一個謎。在那之後更好地檢查內容。