【发布时间】: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"(\{\{([^}]*(?:}(?!})[^}]*)*)\}\})");。 -
谢谢维克托。增强捕获似乎正是我想要的。