在C ++中使用std :: regex获得最小匹配

时间:2014-03-27 14:38:32

标签: c++ regex match

我有这段代码:

std::smatch m;
std::string dataType = "type = struct A {\nint a;\nint b;\nint c; }";

std::regex_search(dataType, m, std::regex("(= )(.*)( [{]|\n|$)"));
std::cout << m.str(2) << std::endl;

问题是它返回最长的匹配,但我需要最小的匹配。 输出是:

struct A {\n
int a;\n
int b;\n
int c; }

但它必须是:

  

struct A

如何获得我想要的结果?

3 个答案:

答案 0 :(得分:2)

您可以将.*更改为.*?

阅读greediness

(你真的打算在正则表达式中添加一个文字换行符吗?你可能想要\\n

答案 1 :(得分:0)

获得&#34; struct A&#34;从您的文本中,要使用的正则表达式是:

\=\s(\w+\s\w+)

如果您有其他情况,请提供更多规格或输入示例以及输出结果。

修改 感谢user3259253,正确的解决方案是:

\\=\\s(\\w+(\\s\\w+)?)

答案 2 :(得分:0)

是的,请使用:

std::regex_search(dataType, m, std::regex("(= )(.*)([\\{]|\\n)$"));

但是,如果您只想捕捉 = 符号和大括号/行尾之间的内容,那么您就不需要这么多() 组。这就够了:

std::regex_search(dataType, m, std::regex("= (.*)[\\{]|\\n$"));
std::cout << m.str(1) << std::endl;

请注意,我们在此处将文本作为第一个条目 m.str(1)而不是第二个条目,因为我们已经删除了&#34;( =)&#34;