【问题标题】:Recursive regular expression match with boost递归正则表达式匹配提升
【发布时间】:2019-10-30 13:07:11
【问题描述】:

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

在互联网上查找,我发现这是一个众所周知的问题,人们建议使用 boost 库。这是罪魁祸首:

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

我要做的基本上是使用这个正则表达式根据空格和括号拆分语句(包括括号内平衡括号的情况),但是显示如何使用 boost 执行此操作的每段代码都无法正常工作我不知道为什么。提前致谢。

【问题讨论】:

  • 请添加不起作用的代码和具有预期结果的示例字符串。
  • 到目前为止你做了什么?如果我们不知道您尝试了什么,我们将无法帮助您。我们可能会建议您已经知道不适合您的东西,这会浪费我们和您的时间。
  • 那么它匹配的问题是什么?试试R"((\((?:[^()]++|(?1))*\))|\w+)"
  • 谢谢! R"...." 解决了我的问题!

标签: c++ regex boost


【解决方案1】:

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

参见,这些是相同的声明:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    相关资源
    最近更新 更多