2010-01-21 55 views
5

我有一个像下面的简化示例的正则表达式:使用JavaScript的正则表达式查找第一个和最长的比赛

var exp = /he|hell/; 

当我在一根绳子上运行它,它给我的第一场比赛,FX:

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

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

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

这可能吗?

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

var exp = /h..|hel*/ 
+0

你的第二个例子会更有趣,如果它是例如:'/ h .... | hel * /' – 2010-01-21 14:00:50

+0

它对我来说看起来是一样的。我其实想说明最长的正则表达式不一定是最长的匹配。我的简单表达式应该是'/ h。*?| hello /'。但我猜这个网站的用户无论如何都知道我的意思。至少你做了:-) – 2010-01-21 14:06:56

+0

如果可以在javascript中使用可变宽度lookbehind断言(因为它们例如在.NET和JGsoft正则表达式中),您可以通过以下方式实现它:'exp = /.*(?<=h .. | hel *)/'。但是到目前为止,这个功能在JS中是不可预料的。 – 2010-01-21 15:43:17

回答

2

我知道的所有正则表达式实现将尝试从左到右匹配字符/模式,并在每次找到全部匹配时终止。换句话说:如果你想确保你获得最长的匹配,你需要尝试所有模式(单独),存储所有匹配,然后从所有可能的匹配中获得最长的匹配。

+1

我知道。我编辑了这个问题。感谢你的回答。我将首先找到第一个匹配的索引,然后将^加到每个RegExp中,并从第一个索引开始搜索子串,因为查找不在那里的表达式,请求遍历所有文本。 – 2010-01-21 14:16:19

3

如何/hell|he/

+3

并不总是像这个例子那样明显。 – Jirka 2011-06-13 13:28:32

+0

简单但具有破坏性。 :) – zx81 2014-06-11 06:25:12

1

您不能用正则表达式做“”“最长匹配”(或涉及计数,减去预见的任何事情)。

最好的办法是找到全部匹配项,并简单比较程序中的长度。

+0

通过查找所有匹配你的意思分开在|的正则表达式并分别寻找每个部分? (因此,我们不需要查找(a |(b(c | d)),我们需要查找3个表达式:a,bc,bd。不知道是否还需要考虑可选性 或者是否有一些支持查找所有匹配? – Jirka 2011-06-13 13:26:59

+0

@ Jirka-x1:有支持找到* next *匹配;我只是想写一个遍历每一个匹配的循环,并保持哪个最长的跟踪 – 2011-06-13 15:11:42

+0

我不确定关于JavaScript,但在Java中,你的方法不起作用。 'Matcher m = Pattern.compile(“hell”).matcher(“hello world”); while(m.find()){ System.out.println(m.group()); }' 产生一个结果:'he'。第二个和随后的invoca find()的第一个字符开始于前一个调用不匹配的第一个字符。 – Jirka 2011-07-03 10:07:38

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