我想使用正则表达式从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"
...
我做错了什么?
答案 0 :(得分:1)
您可以在第一个(a|b)
周围使用捕获组,然后使用反向引用:
-(a|b)(.*?)\1-
请参阅regex demo。这次你会得到what[2]
的结果。
在C ++中,声明
boost::regex re("-(a|b)(.*?)\\1-");
我还建议使用延迟点.*?
,以便在a
或b
到第一个出现后的a
之后获取子字符串{{ 1}}或b
。
仅供参考:regex_match
仅匹配完整字符串。如果您要查找部分匹配项,请使用regex_search
。
对于comleteness:如果你想将结果导入第1组(通过what[1]
),你需要一个分支重置分组结构:
-(?|a(.*?)a|b(.*?)b)-
答案 1 :(得分:0)
*
允许零长度匹配。您可以尝试+
,要求一个或多个(因此.+
将是任何一个或多个字符)。