用正则表达式拆分字符串,忽略大括号内出现的分隔符

时间:2016-12-11 12:18:32

标签: c++ regex qregexp

假设我有一个字符串

  

Max and Bob and Merry and {Jack and Co.} and Lisa

我需要将其分隔为and作为分隔符,但前提是它不会出现在花括号中

所以从上面的字符串我应该得到5个字符串:
MaxBobMerryJack and Co.Lisa

我尝试过这样的模式:

[^\\\{.+]\\band\\b[^.+\\\}]

但它不起作用 - JackCo.仍然是分开的(我使用C ++所以我必须两次转义特殊字符。)

3 个答案:

答案 0 :(得分:2)

如果QRegExp支持lookaheads,您可以通过查看最后一个字边界检查内部是否有mtrs[k] with no opening }

{

See this demo at regex101

需要根据需要进行转义或尝试@SMeyer评论的原始字符串文字。

答案 1 :(得分:1)

这是一个可能的解决方案,部分基于bobble-bubble的评论。它将按要求生成五个字符串,不包含空格或大括号。

std::string text = "Max and Bob and Merry and {Jack and Co.} and Lisa";
std::regex re(R"(\}? +and +(?![^{]*\})\{?)");

std::sregex_token_iterator it(text.begin(), text.end(), re, -1);
std::sregex_token_iterator end;

while (it != end)
    std::cout << *it++ << std::endl;

我试图保持简单,您可能希望用完整的空格检测替换and周围的空格。可以使用交互式版本here

答案 2 :(得分:0)

{...}部分先匹配。也就是说,将它放在|的左侧。

\{.*?\}|and

如果可能,该匹配{foo and bar},如果不匹配,则会尝试匹配and