【问题标题】:C++ RegEx repeated capturing groupsC++ RegEx 重复捕获组
【发布时间】:2016-01-26 14:51:22
【问题描述】:

我正在尝试解析表单的字符串

{{name1 | filter1|filter2 |filter3}} 变成(name1, filter1, filter2, filter3)

我有一个正则表达式:

static const regex r("\\{\\{\\s*([\\.\\w]+)(\\s*\\|\\s*[\\.\\w]+)*\\s*\\}\\}");

我想找到第二组的所有次出现,其中标有 Kleene 星 (...)*。问题是我只能找到该组的最后一次出现。

我使用以下正则表达式:

static const regex r("\\{\\{\\s*([\\.\\w]+)((\\s*\\|\\s*[\\.\\w]+)*)\\s*\\}\\}");

找到第二个捕获组(整个子字符串" | filter1|filter2 |filter3")并用另一个正则表达式解析它。

如何在 C++ 中完成?

最相似的问题在这里: Regex: Repeated capturing groups

【问题讨论】:

  • 所以,你想用(替换{{,用)替换}},用,替换|。为什么这么复杂的正则表达式。
  • Сергей,您是否考虑过使用原始字符串文字?反斜杠不是正则表达式最好的朋友。使用R"(PATTERN_HERE)"。 C++ std::regex 不支持 C# CaptureCollection 之类的东西。匹配整个子字符串,然后拆分/解析。这更容易。我会使用std::regex r(R"(\{\{([^}]*(?:}(?!})[^}]*)*)\}\})");
  • 或者,您可以使用Boost regex library match_results::captures
  • 谢谢维克托。增强捕获似乎正是我想要的。

标签: c++ regex


【解决方案1】:

您需要在“*”表达式周围添加 (),以匹配第二组。

(\s*\|\s*[\.\w]+)*

这里,() 组匹配 1 个实例:SP | SP 字 即使“*”匹配零个或多个实例。 将其更改为:

((\s*\|\s*[\.\w]+)*)

或者,要清楚内部 () 不是标记表达式:

((?n:\s*\|\s*[\.\w]+)*)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多