Javascript 为什么这个点不贪婪?

Javascript 为什么这个点不贪婪?,javascript,regex,Javascript,Regex,我不明白为什么这个正则表达式中的与整个字符串不匹配: var re = /.+b/g, st = "aaaaaabcd"; console.log( st.match(re) ); //["aaaaaab"] 我一直在努力学习贪婪,似乎+应该匹配所有字符,因为基本上匹配所有字符。这与*相同。有人能解释一下吗?这个+可以匹配整个字符串,但是它后面的b将没有匹配的内容。贪婪匹配意味着它将尽可能多地匹配,同时仍然使后面的模式能够成功匹配。实际上,在某种程度上,它确实匹配整个字符串。您的正

我不明白为什么这个正则表达式中的
与整个字符串不匹配:

var re = /.+b/g,
    st = "aaaaaabcd";

console.log( st.match(re) ); //["aaaaaab"]


我一直在努力学习贪婪,似乎
+
应该匹配所有字符,因为
基本上匹配所有字符。这与
*
相同。有人能解释一下吗?

这个
+
可以匹配整个字符串,但是它后面的
b
将没有匹配的内容。贪婪匹配意味着它将尽可能多地匹配,同时仍然使后面的模式能够成功匹配。

实际上,在某种程度上,它确实匹配整个字符串。您的正则表达式匹配器执行一种称为回溯的操作,这会导致它进行备份,直到找到合适的匹配项为止。所以用你的表情:

/.+b/
比赛是这样的:

    aaaaaabcd
.+  ---------
b            x
然后它发现它不能匹配be,因此
+
术语“放弃”了它的一个匹配项,于是母亲再次尝试:

    aaaaaabcd
.+  --------
b           x
仍然没有匹配,所以它放弃了另一个(这不会有帮助),和另一个,直到它达到此状态:

    aaaaaabcd
.+  ------
b         -

这是正则表达式的最长匹配。

嗯,
+
肯定是贪婪的。。。你就是看不见

正则表达式引擎将匹配字符串中最长为
d
的所有字符,一旦找到,将查找
b
,但找不到它

因此,它返回一个字符(称为回溯),现在介于
c
d
之间,并再次尝试匹配
b
,但没有成功(
d
在前面,而不是
b

它再次回溯到
b
c
之间,但再次失败

它再次回溯并进入
a
b
之间,最后匹配!这就是它停止回溯并返回您看到的结果的地方

这就是为什么你会得到:

var re = /.+b/g,
    st = "aaaaaabcdbaa";

console.log( st.match(re) ); //["aaaaaabcdb"]
它在最后2个
a
s后回溯,并在最后一个
b
处匹配

这就是贪婪

相反地

var re = /.+?b/g,
    st = "aaaaaabcdbaa";

console.log( st.match(re) ); //["aaaaaab"]
这就是懒惰

一些引擎有操作员来防止这种回溯,这个过程通常会使正则表达式非常慢;想象一下,必须在一个字符串中多次回溯(通常有大量
*
的字符串)。

var re=/.*/g,
st=“asdfblahasdf”;
控制台日志(st.match(re));

你必须小心正则表达式中贪婪的数学。上面的示例仍然与整个字符串匹配。从您的jsbin中获取。

因此它确实。。。您正在尝试查找
b
字母的所有字符。。。它确实找到了。正则表达式不匹配任何后跟b的字符串吗?因此,使用
就是要捕获正则表达式中下一个字符的第一个实例还是最后一个?
var re = /<tr>.*<\/tr>/g,
    st = "<tr>asdf</tr>blah<tr>asdf</tr>";

console.log( st.match(re) );