QRegularExpression:跳过匹配的转义标记

QRegularExpression: skip matching escaped tokens

我正在使用 QRegularExpression 替换 QString,但我遇到了转义标记的问题。

例如:字符串中的 "{aaa}" 应替换为 "bbb",但应忽略 "\{aaa}" 并设置 "{aaa}"(没有"\").

例如:

this is a test called {aaa} -> this is a test called bbb
this is a test called \{aaa} -> this is a test called {aaa}

我正在使用

QString& replace(const QRegularExpression& re, const QString& after);

但我找不到跳过转义匹配的方法。我猜是消极的回头看,但如何?

我找到了解决方案:

QRegularExpression re(QString("(?<!\\)({aaa})")

我只是错过了要匹配反斜杠,必须使用 4。

您提出的模式 - (?<!\){aaa} - 将不匹配前面带有有效转义反斜杠 \{aaa} 的有效 {aaa},请参阅 this demo

您需要的是一个正则表达式来解释这些转义的反斜杠:

(?<!\)(?:\{2})*\K{aaa}

参见regex demo

详情:

  • (?<!\) - 如果在当前位置
  • 的左侧紧邻 \,则匹配失败的负面回顾
  • (?:\{2})* - 双反斜杠出现零次或多次
  • \K - 匹配重置运算符丢弃目前匹配的文本
  • {aaa} - 文字 {aaa} 子串。

在 Qt 中,字符串文字可能包含 转义序列 \n 表示换行符、\r 表示回车符 return 等。要定义文字反斜杠(用于形成 regex 转义 、regex 运算符、shorthand 字符 类),您需要加倍反斜杠:

QRegularExpression re("(?<!\\)(?:\\{2})*\K{aaa}")