2011-10-21 46 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