使用或匹配正则表达式

时间:2016-06-17 13:16:28

标签: c++ regex boost

我想使用正则表达式从docker-compose -f docker-compose.yml -f docker-compose.conf.yml up foo中提取-afooa-

我首先尝试了这个(使用-bfoob-):

boost

这有效,但允许std::string input = "-afooa-"; boost::regex re("-(?:a|b)(.*)(?:a|b)-"); boost::smatch what; bool isMatchFound = boost::regex_match(input, what, re); if (isMatchFound && what.size() == 2) { std::cout << what[1]; } ....所以我试图更新我的正则表达式,在阅读正则表达式文档后,我觉得我需要一个或条件&#34;非标记括号&#34;最后得到了这个正则表达式-afoob-但是找到了两个匹配-(?:a(.*)a|b(.*)b)-"foo" ...

我做错了什么?

2 个答案:

答案 0 :(得分:1)

您可以在第一个(a|b)周围使用捕获组,然后使用反向引用:

-(a|b)(.*?)\1-

请参阅regex demo。这次你会得到what[2]的结果。

在C ++中,声明

boost::regex  re("-(a|b)(.*?)\\1-");

我还建议使用延迟点.*?,以便在ab第一个出现后的a之后获取子字符串{{ 1}}或b

仅供参考:regex_match仅匹配完整字符串。如果您要查找部分匹配项,请使用regex_search

对于comleteness:如果你想将结果导入第1组(通过what[1]),你需要一个分支重置分组结构:

-(?|a(.*?)a|b(.*?)b)-

请参阅Boost regex referencea demo

答案 1 :(得分:0)

*允许零长度匹配。您可以尝试+,要求一个或多个(因此.+将是任何一个或多个字符)。