C++ 使用或匹配正则表达式

C++ 使用或匹配正则表达式,c++,regex,boost,C++,Regex,Boost,我想使用正则表达式从-afooa-或-bfoob-中提取foo 我第一次尝试这个(使用boost): std::string input=“-afooa-”; boost::正则表达式re(“-(?:a | b)(.*)(?:a | b)-”; 刺激:smatch什么; bool isMatchFound=boost::regex_匹配(输入,什么,re); if(isMatchFound&&what.size()==2) { std::cout您可以在第一个(a | b)周围使用捕获组,然后

我想使用正则表达式从
-afooa-
-bfoob-
中提取
foo

我第一次尝试这个(使用
boost
):

std::string input=“-afooa-”;
boost::正则表达式re(“-(?:a | b)(.*)(?:a | b)-”;
刺激:smatch什么;
bool isMatchFound=boost::regex_匹配(输入,什么,re);
if(isMatchFound&&what.size()==2)
{ 

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

-(a|b)(.*?)\1-
请参阅。这次您将在
what[2]
中获得结果

在C++中,声明

boost::regex  re("-(a|b)(.*?)\\1-");
我还建议使用惰性点
*?
,以便将
a
b
后的子字符串移到下一个
a
b
的第一个匹配项

仅供参考:
regex\u-match
将只匹配完整字符串。如果要查找部分匹配,请使用
regex\u-search

对于完整性:如果要将结果放入组1(通过
what[1]
),则需要一个分支重置分组构造:

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

请参阅和。

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

作为选项,您可以使用
-(a | b)foo\1-
请您用正则表达式风格或编程语言的类型来标记您的问题好吗?@revo:Done,但是,我想这不是我的编程语言特有的…您发布了一个代码块并询问了一个正则表达式。所以我不会错的。谢谢!
-(?| a(.*)a | b(.*)b)-
成功了。你能解释一下我的原始版本(
-(?:a(.*)a | b(.*)b)
)有什么问题吗?
-(?:a(.*)a | b(.*)b)
模式匹配
-
,然后是两个模式中的一个:
a(.*))a
-
a
后跟任何0+字符,除了最后一个
a
的换行符以外,该行将
a
s之间的子字符串捕获到组1或组2中
b(.*)b
-
b
后跟任何0+字符,而不是在将
b
s之间的子字符串捕获到组2中的行上的最后一个
b
的换行符。因此,您需要检查哪个组匹配。当使用分支重置时,组索引从一个分支重置到另一个分支,并使用Ind获得第一个捕获组ex 1和分支2中的第二个索引相同。感谢您的帮助、答案和正则表达式课程;-)
-(?|a(.*?)a|b(.*?)b)-