我有一个包含以下内容的QString:
“MXTP24 \\ X00 X00 \\ \\ XF4 \\ xF9 \\ X80 \ r \ n” 个
我希望它成为:
“MXTP24 \ X00 \ X00 \ XF4 \ xF9 \ X80 \ r \ n” 个
我需要将“\ x”替换为“\ x”,以便我可以开始解析值。但下面的代码,我认为应该做的工作是没有做任何事情,因为我之前和之后得到相同的字符串:
qDebug() << "BEFORE: " << data;
data = data.replace("\\\\x", "\\x", Qt::CaseSensitivity::CaseInsensitive);
qDebug() << "AFTER: " << data;
在这里,没有变化!
然后我试着这样:
data = data.replace("\\x", "\x", Qt::CaseSensitivity::CaseInsensitive);
然后编译器抱怨\x used with no following hex digits!
任何想法?
答案 0 :(得分:2)
首先让我们看看这段代码的作用:
data.replace("\\\\x", "\\x", ....
第一个字符串在编译代码中变为\\x
,并用作正则表达式。在reqular表达式中,反斜杠是特殊的,需要使用另一个反斜杠进行转义以表示实际的单反斜杠字符,并且正则表达式就是这样。 C + n字符串文字正则表达式中的4个反斜杠意味着匹配目标文本中的单个文字反斜杠。因此,您的reqular表达式与文字2个字符的字符串\x
匹配。
然后你替换它。替换不是reqular表达式,因此反斜杠不需要在此处进行双重转义,因此您最终使用文字2-char替换字符串\x
,这与您匹配的字符串相同,所以即使在那里是匹配,没有任何变化。
然而,这不是你的问题,你的问题是qDebug()
如何打印字符串。它将它们打印出来。输出开始时\"
表示实际字符串中只有双引号,1个字符,因为双引号被转义。那些\\
也是单反斜杠char,因为文字反斜杠也被转义(因为它是转义字符,对下一个字符有特殊含义)。
因此,您似乎根本不需要进行任何搜索替换,只需将其删除即可。
尝试以其中一种方式打印QString以获得字面显示:
std::cout << data << std::endl;
qDebug() << data.toLatin1().constData();