考虑以下代码:
wstring String = L"HMM";
wsmatch Matches;
if( regex_match( String, Matches, wregex( L"(H+|M+)([^HM]*)(H+|M+)([^HM]*)(H+|M+)" ) ) )
wcout << Matches[1].str() << L"-" << Matches[3].str() << L"-" << Matches[5].str() << endl;
else
wcout << L"No match\n";
您会期望第二个 M+
会贪婪地消耗所有 M,并给我们一个 No match
作为结果。相反,我们得到 H-M-M
作为结果。
看起来 VS13 试图最大化子匹配的数量并为此牺牲贪婪?
最佳答案
+
表示一个或多个,并且您有三个组需要一个或多个 H 和 M,这就是为什么您在每个组中获得一个。
(H+|M+) # Would like to match H
([^HM]*) # Accepted since you allow 0 occurrences
(H+|M+) # Would like to match MM, but can only M
([^HM]*) #
(H+|M+) # This NEEDS to match the last H or M
贪婪意味着它会尽可能匹配,但绝不会为了贪婪而牺牲匹配。
关于c++ - VS13 C++ 贪心匹配不够贪心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30845642/