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

+ is supposed to be greedy, so why am I getting a lazy result?

为什么下面的正则表达式 return 101 而不是 1001

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

我认为 + 是贪婪的,所以两个匹配中较长的应该 returned。

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

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

正则表达式总是从左到右阅读!它不会寻找更长的时间。如果有多个匹配,则需要重新执行正则表达式来获取它们,并自行比较它们的长度。

贪婪意味着直到最右边的出现,它绝不意味着输入字符串中最长的

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

由于字符串是从左到右解析的,所以101会先在101001中匹配,其余的(001)不会匹配(因为1011001 匹配 重叠 )。您可以使用 /(?=(10+1))./g 然后检查每个第 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