c++ - VS13 C++ 贪心匹配不够贪心

标签 c++ regex visual-studio-2013

考虑以下代码:

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/

相关文章:

regex - Mercurial .hgignore 负前瞻

java - 逐行将字符串写入文本文件时避免重复

asp.net - 为 xxxxx 生成设计器文件失败 : Error HRESULT E_FAIL has been returned from a call to a COM component

c++ - 编译时 "strlen()"有效吗?

c++ - 使用 C++ (CFBundleGetMainBundle) 获取包中文件的路径

c++ - 为什么main函数不能返回负数?

Python提取可量化文本(数字)

c++ - 预编译 header IntelliSense 错误

css - 为什么警告 "Selector specificity 0, 2, 0"?

c++ - 使用 g++ 编译动态共享库