+ 应该是贪婪的,那为什么我会得到一个懒惰的结果呢?
+ 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
)不会匹配(因为101
和 1001
匹配 重叠 )。您可以使用 /(?=(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
为什么下面的正则表达式 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
)不会匹配(因为101
和 1001
匹配 重叠 )。您可以使用 /(?=(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