使用javascript regexp查找第一个和最长的匹配项

使用javascript regexp查找第一个和最长的匹配项,javascript,regex,Javascript,Regex,我有一个类似以下简化示例的RegExp: var exp = /he|hell/; 当我在字符串上运行它时,它将为我提供第一个匹配项,fx: var str = "hello world"; var match = exp.exec(str); // match contains ["he"]; 我想要第一个也是最长的匹配, 我的意思是按索引排序,然后按长度排序 由于表达式是由一个RegExp数组组合而成的,因此我正在寻找一种不必重写正则表达式就能找到最长匹配项的方法 这可能吗 如果不是,我

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

var exp = /he|hell/;
当我在字符串上运行它时,它将为我提供第一个匹配项,fx:

var str = "hello world";
var match = exp.exec(str);
// match contains ["he"];
我想要第一个也是最长的匹配, 我的意思是按索引排序,然后按长度排序

由于表达式是由一个RegExp数组组合而成的,因此我正在寻找一种不必重写正则表达式就能找到最长匹配项的方法

这可能吗

如果不是,我正在寻找一种方法来轻松地分析表达式,并将其按正确的顺序排列。但是我不知道为什么,因为表达式可能要复杂得多,fx:

var exp = /h..|hel*/

我所知道的所有正则表达式实现都将(尝试)从左到右匹配字符/模式,并在发现完全匹配时终止

换句话说:如果你想确保获得尽可能长的匹配,你需要尝试所有模式(单独),存储所有匹配,然后从所有可能的匹配中获得最长的匹配。

你不能用正则表达式进行“最长匹配”(或任何涉及计数、减去look aheads的操作)


您的最佳选择是找到所有匹配项,然后简单地比较程序中的长度。

您可以这样做。这里解释如下:


(总之,在搜索的第二部分中,用问号更改操作数顺序或组。)

我不知道这是否是您要找的(考虑到这个问题已经有将近8年的历史了……),但我有一点保留意见:

(将he切换为hell将根据最大的第一个执行搜索)


其中match[0]将是所有匹配字符串中最长的字符串。

如果您的第二个示例是:
/h…| hel*/
,那么它在我看来是一样的。我实际上想说明,最长的regexp不一定是最长的匹配。我的简单表达式应该类似于
/h.*hello/
。但我想这个网站的用户知道我的意思。至少您做到了:-)如果可变宽度的lookbehind断言在javascript中是可能的(例如在.NET和JGsoft regex中),您可以通过以下方式实现:
exp=/*(?我知道。我编辑了这个问题。谢谢你的回答。我将首先查找第一个匹配项的索引,然后将“^”添加到每个RegExp,并从第一个索引开始搜索子字符串,因为查找不存在的表达式,所有文本中都会出现请求。查找所有匹配项意味着将regex拆分为|并查看对每个部分分别进行ing?(因此,我们不需要寻找(a |)(b(c | d)),而需要寻找3个表达式:a、bc、bd。我想知道是否还需要考虑可选性)。或者有没有一些对查找所有匹配项的支持?@Jirka-x1:有对查找下一个匹配项的支持;我只是想编写一个循环,遍历每个匹配项并跟踪最长的匹配项。我不确定javascript,但在Java中,您的方法不起作用。
Matcher m=Pattern.compile(“他|地狱”).Matcher(“你好,世界”);而(m.find()){System.out.println(m.group());}
生成一个结果:“he”。第二次和后续的find()调用从第一个字符开始,与前一次调用不匹配。请参见上面的示例(我按enter键太快)@Jirka:如果您希望尽可能匹配较长的,请使用正则表达式
he(ll)?
它并不总是像本例中那样明显。简单但具有破坏性。:)这对我很有帮助。我可以对or子句的顺序进行排序。问题已解决。
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]);
 }