2011-10-21 47 views
2

謝謝你看我的問題。Regular Expression Alternatives(All Matches)

我有替代品的一個長長的清單,我想在一個正則表達式匹配:

var re = new RegExp('o1|o2|o3|o4|o5|...','g')

的問題,我遇到的是,如果O1 O2是一個字符串會發生什麼。例如

var re = new RegExp('a|b|c|ab|abc','g')

var s = 'abc'

s.match(re) - > [ 「A」, 「B」, 「C」]

我想爲它也能夠匹配的「AB 「和」abc「。我意識到如果我改變RegExp的順序,我可以讓它匹配更長的字符串,但我真的想獲得所有匹配。

這樣做的最好方法是什麼?這並不一定是處理一長串替代品的最佳(或好方法)。我想過用自己的正則表達式來測試每個替代方案,但這似乎效率較低。

任何指導都會很棒。謝謝!

+0

所以,你要的所有可能的匹配這些替代品?我不認爲只有一個表達式纔有可能。 –

+0

是的,那是我想要的。過去我使用過這個解決方案,我有一個沒有重疊的選項列表,它比檢查每個選項的自己的正則表達式或使用indexOf更快。我認爲,因爲替代方案中可能存在重疊,我只需要遍歷列表: -/ – bobjenkins1234

回答

1

如果您的RegExp中只有一長串備選方案,則更好的方法是使用StringindexOf方法。這裏是一個輸出字符串中的所有替代指標代碼:

var alternatives = ['a', 'b', 'c', 'ab', 'abc'], 
    s = 'abc, cba', 
    i, 
    index; 

for (i = 0; i < alternatives.length; i++) { 
    index = -1; 
    do { 
     index = s.indexOf(alternatives[i], index+1); 
     if (index !== -1) { 
      console.log(alternatives[i], index); 
     } 
    } while (index !== -1); 
} 
+0

那麼只需在每個替代方案上運行'indexOf'並跟蹤匹配? – bobjenkins1234

+0

@ bobjenkins1234添加了代碼。 – bjornd

+0

indexOf無法在 voigtan

0

如果你試圖將整個字符串像​​匹配,那麼Rgex是:

^(a|b|c|ab|abc)$ 

但有可能更容易方式,但爲了幫助你,我必須知道你想要檢查的所有「替代品」。也許更短的正則表達式是可能的。

0

你可以設置多個(capturing groups)獲得所有比賽......你仍然需要訂購你的選擇相應

使用你的例子:

var re = /((a)(b))(c)|(a)(b)|a|b|c/ 
var s5 = 'abc'; 
var s4 = 'ab'; 
var s3 = 'a'; 
var s2 = 'b'; 
var s1 = 'c'; 

console.log(s5.match(re)); // ['abc', 'ab', 'a', 'b', 'c', undef, undef] 
console.log(s4.match(re)); // ['ab', undef, undef, undef, undef, 'a', 'b'] 
console.log(s3.match(re)); // ['a', ... undef x 6 ...] 
console.log(s2.match(re)); // ['b', ... undef x 6 ...] 
console.log(s1.match(re)); // ['c', ... undef x 6 ...] 

More info on capturing groups