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}")
我正在使用 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}")