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) );