且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

std :: regex_match和具有奇怪行为的惰性量词

更新时间:2023-02-19 23:37:14

我看不到任何不一致之处. regex_match尝试匹配整个字符串,所以s?/.+?/g?延迟扩展直到覆盖整个字符串.

I don't see any inconsistency. regex_match tries to match the whole string, so s?/.+?/g? lazily expands till the whole string is covered.

这些图"(用于regex_search)有望帮助人们获得贪婪的想法:

These "diagrams" (for regex_search) will hopefully help to get the idea of greediness:

Non-greedy:

a.*?a: ababa
a|.*?a: a|baba
a.*?|a: a|baba  # ok, let's try .*? == "" first
# can't go further, backtracking
a.*?|a: ab|aba  # lets try .*? == "b" now
a.*?a|: aba|ba
# If the regex were a.*?a$, there would be two extra backtracking
# steps such that .*? == "bab".

Greedy:

a.*?a: ababa
a|.*a: a|baba
a.*|a: ababa|  # try .* == "baba" first
# backtrack
a.*|a: abab|a  # try .* == "bab" now
a.*a|: ababa|

在这种情况下,regex_match( abc )就像regex_search( ^abc$ ).