我有一个类似于以下简化示例的RegExp:
var exp = /he|hell/;
当我在一个字符串上运行时,它会给我第一个匹配,fx:
var str = "hello world";
var match = exp.exec(str);
// match contains ["he"];
我想要第一个也是最长的匹配, 我的意思是按索引排序,然后是长度。
由于表达式是从RegExp数组合起来的,我正在寻找一种方法来找到最长的匹配,而不必重写正则表达式。
这甚至可能吗?
如果不是,我正在寻找一种方法来轻松分析表达式,并按正确顺序排列。但我无法弄清楚,因为表达式可能会复杂得多,fx:
var exp = /h..|hel*/
答案 0 :(得分:4)
/hell|he/
怎么样?
答案 1 :(得分:3)
你可以做到。它在这里解释: http://www.regular-expressions.info/alternation.html
(总之,在搜索的第二部分用问号更改操作数顺序或组。)
答案 2 :(得分:2)
我所知道的所有正则表达式实现都会(尝试)从左到右匹配字符/模式,并在找到全部匹配时终止。
换句话说:如果你想确保你获得最长的匹配,你需要尝试所有模式(单独),存储所有匹配,然后从所有可能的匹配中获得最长的匹配。
答案 3 :(得分:1)
您不能使用正则表达式执行“最长匹配”(或任何涉及计数,减去前瞻的事情)。
您最好的选择是找到所有匹配,然后只是比较程序中的长度。
答案 4 :(得分:0)
我不知道这是否是您正在寻找的(考虑到这个问题已经有将近8年了......),但这是我的一粒盐:
(切换他为地狱将根据最大的第一个进行搜索)
var exp = /hell|he/;
var str = "hello world";
var match = exp.exec(str);
if(match)
{
match.sort(function(a, b){return b.length - a.length;});
console.log(match[0]);
}
匹配[0]将是匹配的所有字符串中最长的。