由于Qt5的正则表达式引擎不支持后行断言,我们需要使用一种不同的方法。在Qt中,我们可以通过先匹配Lang::Tr(
,然后确保在接下来的字符中没有出现我们想要匹配的tr("文")
,或者通过其他逻辑来手动检查。如下代码:
#include <QString>
#include <QDebug>
QString replaceTrWithoutLangTr(const QString &input) {
// 定义要查找和替换的字符串
QString trString = "tr(\"文\")";
QString langTrString = "Lang::Tr(";
QString replacementString = "Lang::Tr(tr(\"文\"),\"1\")";
QString result = input;
// 遍历输入字符串
int index = 0;
while (index < result.length())
{
// 检查当前位置是否包含 tr(
int trIndex = result.indexOf(trString, index);
if (trIndex != -1)
{
// 判读前面是否有Lang::Tr(
int langTrIndex = trIndex-langTrString.count()-5;
langTrIndex = langTrIndex<0?0:langTrIndex;
QString tempLangTr = result.mid(langTrIndex,langTrString.count()+5);
if(tempLangTr.contains(langTrString))
{
//包含
}
else
{
//不包含,替换
// 找到了 tr(,现在查找它的结束右括号
int closingParenthesisIndex = result.indexOf(')', trIndex + trString.length());
result.replace(trIndex,trIndex + trString.length(),replacementString);
}
}
index++;
}
// 返回处理后的字符串
return result;
}
int main() {
QString test1 = "55566tr(\"文\")11122";
QString test2 = "55566Lang::Tr(tr(\"文\"),\"100\")11122";
QString test3 = "some text tr(\"文\") more text";
QString test4 = "some text Lang::Tr(something) tr(\"文\")";
QString test5 = "Lang::Tr(other) some text tr(\"文\")";
QString new_test1 = replaceTrWithoutLangTr(test1);
qDebug() <<test1<<"->"<<new_test1;
QString new_test2 = replaceTrWithoutLangTr(test2);
qDebug() <<test2<<"->"<<new_test2;
qDebug() << replaceTrWithoutLangTr(test3);
QString new_test3 = replaceTrWithoutLangTr(test3);
qDebug() <<test3<<"->"<<new_test3;
QString new_test4 = replaceTrWithoutLangTr(test4);
qDebug() <<test4<<"->"<<new_test4;
QString new_test5 = replaceTrWithoutLangTr(test5);
qDebug() <<test5<<"->"<<new_test5;
return 0;
}