1

我正在替换一个QStringusingQRegularExpression但我遇到了转义令牌的问题。

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

例如:

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

我在用着

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

但我找不到跳过逃跑比赛的方法。我猜想是消极的后视,但是如何呢?

4

2 回答 2

2

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

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

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

请参阅正则表达式演示

详情

  • (?<!\\)- 如果\在当前位置的左边有一个
  • (?:\\{2})*- 零次或多次出现双反斜杠
  • \K- 匹配重置运算符丢弃到目前为止匹配的文本
  • {aaa} - 文字{aaa}子串。

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

QRegularExpression re("(?<!\\\\)(?:\\\\{2})*\\K{aaa}")
于 2017-05-02T19:34:41.027 回答
0

我找到了解决方案:

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

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

于 2017-04-14T11:49:33.077 回答