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)-