使用javascript正则表达式查找第一个AND最长匹配

时间:2010-01-21 13:56:40

标签: javascript regex

我有一个类似于以下简化示例的RegExp:

var exp = /he|hell/;

当我在一个字符串上运行时,它会给我第一个匹配,fx:

var str = "hello world";
var match = exp.exec(str);
// match contains ["he"];

我想要第一个也是最长的匹配, 我的意思是按索引排序,然后是长度。

由于表达式是从RegExp数组合起来的,我正在寻找一种方法来找到最长的匹配,而不必重写正则表达式。

这甚至可能吗?

如果不是,我正在寻找一种方法来轻松分析表达式,并按正确顺序排列。但我无法弄清楚,因为表达式可能会复杂得多,fx:

var exp = /h..|hel*/

5 个答案:

答案 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]将是匹配的所有字符串中最长的。