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