递归正则表达式与boost匹配

时间:2019-06-16 21:43:17

标签: c++ regex boost

我遇到了C ++标准正则表达式库无法编译递归正则表达式的问题。

在Internet上查找,我发现这是一个众所周知的问题,人们建议使用Boost库。这是被牵连的一个:

\\((?>[^()]|(?R))*\\)|\\w+

我想做的基本上是使用此正则表达式根据空格和方括号(包括方括号内的平衡方括号)来拆分语句,但是每一段显示如何使用boost进行操作的代码都无法正常工作我不知道为什么。预先感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用R"(...)"语法,使用原始字符串文字来声明正则表达式。这样,您就不必两次转义反斜杠。

cf。,这些是相等的声明:

std::string my_pattern("\\w+");
std::string my_pattern(R"(\w+)");

括号不是正则表达式模式的一部分,它们是原始字符串文字定界符部分。

但是,您的正则表达式不太正确:您只需要递归第一个替代方案,而不是整个正则表达式。

这里是解决方法:

std::string my_pattern(R"((\((?:[^()]++|(?1))*\))|\w+)");

在这里,(\((?:[^()]++|(?1))*\))()以外的1个以上的字符匹配,或者使用(?1) regex subroutine递归整个第1组模式。

请参见regex demo