2017-04-14 243 views
1

我使用QRegularExpression替换QString,但我遇到转义标记问题。QRegularExpression:跳过匹配转义标记

例如:在字符串中一个"{aaa}"应该用"bbb"被取代但"\{aaa}"应该忽略和"{aaa}"将被设置(不"\")。

例如:

这是一个所谓的测试{AAA} - >这是一个所谓的BBB
该试验是被称为\ {AAA}测试 - >这是一个称为{AAA}

测试

我使用

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

,但我不能找到一种方法来跳过逃脱匹配。我猜想用negative look-behind,但是怎么样?

回答

1

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

你需要的是一个正则表达式,将考虑这些逃脱反斜线:

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

regex demo

详细

  • (?<!\\) - 负回顾后失败的比赛,如果有立即\到当前位置的左边
  • (?:\\{2})* - 零个或多个双反斜线
  • \K - 匹配重置运算符丢弃目前匹配的文本
  • {aaa} - lite子字符串。

在Qt,字符串可能包含转义序列\n为换行,\r为回车等。为了定义一个反斜杠(即用于形成正则表达式逸出,regex操作符,速记字符类),您需要加倍反斜杠:

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

很好的解释,谢谢 – marco

0

我已经找到了解决办法:

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

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