C++ Qt QString 用一个替换双反斜杠

C++ Qt QString replace double backslash with one

我有一个包含以下内容的 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!

有什么想法吗?

首先让我们看看这段代码做了什么:

data.replace("\\x", "\x", ....

第一个字符串在编译代码中变为\x,并用作正则表达式。在正则表达式中,反斜杠是特殊的,需要用另一个反斜杠进行转义以表示实际的单个反斜杠字符,而您的正则表达式就是这样做的。 C+n 字符串文字正则表达式中的 4 个反斜杠表示匹配目标文本中的单个文字反斜杠。所以你的正则表达式匹配文字 2 个字符的字符串 \x.

然后你替换它。替换不是正则表达式,所以反斜杠在这里不需要双重转义,所以你最终使用文字 2-char 替换字符串 \x,这与你匹配的相同,所以即使有匹配, 没有任何变化。


然而,这不是你的问题,你的问题是qDebug()如何打印字符串。它打印他们逃脱了。输出开始处的 \" 仅表示实际字符串中的普通双引号 1 个字符,因为双引号被转义了。那些 \ 也是单反斜杠字符,因为文字反斜杠也被转义(因为它是转义字符并且对下一个字符有特殊含义)。

看来您根本不需要进行任何搜索替换,只需将其删除即可。

尝试以这些方式之一打印 QString 以获得字面显示:

std::cout << data << std::endl;

qDebug() << data.toLatin1().constData();