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/

相关文章:

c++ - Valgrind 错误,未初始化的值

c# - 解析值时遇到意外字符

visual-studio - 最小的工作 IVsTextViewCreationListener 实现是什么?

c++ - qdbusxml2cpp 未知类型

c++ - 将辅助函数分离到单独的 C++ 头文件/源文件中

c++ - 通过单击图标、在控制台中键入其名称或从批处理文件来区分程序是否运行

c++ - 在不使用指针的情况下使用结构和数组的访问冲突

iphone - 未知转义序列 - 正则表达式

javascript - javascript 中的正则表达式正则表达式模式用于带逗号的输入

Javascript正则表达式 - 从长字符串中选择一项