感谢您查看我的问题。
我在一个正则表达式中有一长串我想要匹配的替代品:
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 :(得分: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 ...]