为什么以下正则表达式返回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。)
答案 0 :(得分:3)
正则表达式总是从左到右阅读!它不会寻找更长的东西。在多个匹配的情况下,您必须重新执行正则表达式来获取它们,并自己比较它们的长度。
答案 1 :(得分:1)
贪婪意味着直到最右边的事件,它绝不意味着在输入字符串中最长。
正则表达式本身并不是提取最长匹配的正确工具。您可能会获得与您的模式匹配的所有子字符串,并使用特定语言的方法获得最长的子字符串。
由于字符串是从左向右解析的,101
首先匹配101001
,其余(001
)不匹配(101
和1001
匹配重叠)。您可以使用/(?=(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