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

时间:2016-11-01 18:43:12

标签: c++ qt qstring

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

在这里,没有变化!

enter image description here

然后我试着这样:

data = data.replace("\\x", "\x", Qt::CaseSensitivity::CaseInsensitive);

然后编译器抱怨\x used with no following hex digits!

任何想法?

1 个答案:

答案 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();