+应该是贪婪的,为什么我得到一个懒惰的结果?

时间:2016-12-27 11:12:30

标签: regex regex-greedy

为什么以下正则表达式返回101而不是1001



console.log(new RegExp(/1(0+)1/).exec('101001')[0]);




我认为+贪婪,所以应该返回两场比赛的较长时间。

IMO与Using javascript regexp to find the first AND longest match不同,因为我不关心第一个,只是最长的。有人可以纠正我对贪婪的定义吗?例如,上面的片段和经典的#oops之间有什么区别,太贪心了#34; new RegExp(/<(.+)>/).exec('<b>a</b>')[0]给出b>a</b的示例?

(注意:这似乎与语言无关(它也发生在Perl中),但为了便于在浏览器中运行它我在这里使用了JavaScript。)

2 个答案:

答案 0 :(得分:3)

正则表达式总是从左到右阅读!它不会寻找更长的东西。在多个匹配的情况下,您必须重新执行正则表达式来获取它们,并自己比较它们的长度。

答案 1 :(得分:1)

贪婪意味着直到最右边的事件,它绝不意味着在输入字符串中最长。

正则表达式本身并不是提取最长匹配的正确工具。您可能会获得与您的模式匹配的所有子字符串,并使用特定语言的方法获得最长的子字符串。

由于字符串是从左向右解析的,101首先匹配101001,其余(001)不匹配(1011001匹配重叠)。您可以使用/(?=(10+1))./g,然后检查每个Group 1值的长度以获得最长的值。

var regex = /(?=(10+1))./g;
var str = "101001";
var m, res=[];

while ((m = regex.exec(str)) !== null) {
  res.push(m[1]);
}
console.log(res); // => ["101", "1001"]

if (res.length>0) {
  console.log("The longest match:", res.sort(function (a, b) { return b.length - a.length; })[0]);
} // => 1001