正则表达式替代(所有匹配)

时间:2011-10-21 06:40:31

标签: javascript regex

感谢您查看我的问题。

我在一个正则表达式中有一长串我想要匹配的替代品:

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的顺序,我可以让它匹配更长的字符串,但我真的想得到所有匹配。

最好的方法是什么?这似乎不一定是处理一长串备选方案的最佳(或好方法)。我想用自己的正则表达式来测试每个替代方案,但这似乎效率较低。

任何指导都会很棒。谢谢!

3 个答案:

答案 0 :(得分:1)

如果您的RegExp中只有很长的备选列表,则更好的方法是使用indexOf的{​​{1}}方法。以下是输出字符串中所有备选项的索引的代码:

String

答案 1 :(得分:0)

如果您尝试匹配整个字符串,如"abc",那么Rgex将是:

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

但也许有一种更简单的方法,但为了帮助你,我必须知道你想要检查的所有“替代方案”。也许可以使用更短的正则表达式。

答案 2 :(得分: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