QRegularExpression:跳过匹配的转义令牌

时间:2017-04-14 09:51:34

标签: regex-negation qregularexpression

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

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

例如:

  

这是一项名为{aaa}的测试 - >这是一个名为bbb的测试   这是一个名为\ {aaa} - >的测试这是一个名为{aaa}

的测试

我正在使用

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

但是我找不到跳过转义匹配的方法。我猜是negative look-behind,但是怎么样?

2 个答案:

答案 0 :(得分:1)

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

你需要的是一个正则表达式,它将解释这些转义的反斜杠:

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

请参阅regex demo

<强>详情:

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

在Qt中,字符串文字可能包含转义序列\n用于换行,\r用于回车等。要定义文字反斜杠(使用的)要形成 regex转义,正则表达式运算符,速记字符类),你需要加倍反斜杠:

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

答案 1 :(得分:0)

我找到了解决方案:

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

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