2016-11-01 3 views
0

I eine QString mit folgenden Inhalt haben:C++ Qt QString ersetzen Doppel Backslash mit einem

"MXTP24 \\ x00 \\ x00 \\ XF4 \\ xF9 x80 \\ \ r \ n"

ich will es werden:

"MXTP24 \ x00 \ x00 \ XF4 \ xF9 \ x80 \ r \ n"

ich brauche t o ersetze das "\ x" zu "\ x", damit ich die Werte analysieren kann. Aber der folgende Code, die ich denke, sollte die Arbeit tun tut nichts, da ich die gleiche Zeichenfolge erhalten vor und nach:

qDebug() << "BEFORE: " << data; 
data = data.replace("\\\\x", "\\x", Qt::CaseSensitivity::CaseInsensitive); 
qDebug() << "AFTER: " << data; 

hier keine Veränderung!

enter image description here

Dann habe ich versucht so:

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

Dann complaines Compiler, der \x used with no following hex digits!

irgendwelche Ideen?

+0

Es ist für mich funktioniert:

Versuchen Sie, die QString in einem dieser Wege Druck ist buchstäblich gezeigt werden. Wie ist 'Daten' zugeordnet? – krzaq

+1

* Ersetze das "\ x" zu "\ x" *, was? – hyde

+0

Also * Daten * ist ein QString? – hyde

Antwort

2

Zuerst das, was dieses Stück Code aussehen lassen tut:

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

Erster String wird \\x in kompilierten Code und wird als regulärer Ausdruck verwendet. Im Reqular-Ausdruck ist der umgekehrte Schrägstrich ein Sonderfall und muss mit einem anderen umgekehrten Schrägstrich versehen werden, um einen einzelnen umgekehrten Schrägstrich zu bedeuten, und Ihr Regexp tut genau dies. 4 umgekehrte Schrägstriche in C + n Zeichenfolgenliteral regexp bedeutet die Übereinstimmung einzelner umgekehrter Schrägstriche im Zieltext. Ihr reqular-Ausdruck entspricht also der literalen 2-stelligen Zeichenfolge \x.

Dann ersetzen Sie es. Ersetzen ist kein reqular -Ausdruck, daher benötigt der umgekehrte Schrägstrich hier kein doppeltes Escapen. Daher wird am Ende die literale 2-char-Ersatzzeichenfolge \x verwendet. Dies entspricht der Übereinstimmung, die Sie gefunden haben. Selbst wenn es eine Übereinstimmung gibt, ändert sich nichts.


Dies ist jedoch nicht das Problem ist, Ihr Problem ist, wie qDebug() druckt Strings. Es druckt sie entkommen. Das \" am Anfang der Ausgabe bedeutet einfach nur doppelte Anführungszeichen, 1 char, in der tatsächlichen Zeichenfolge, da doppelte Anführungszeichen ist escaped. Und diese \\ sind auch einzelne Backslash-Zeichen, da der umgekehrte Schrägstrich auch maskiert ist (weil es das Escape-Zeichen ist und eine besondere Bedeutung für das nächste Zeichen hat).

So scheint es, dass Sie keine Suche ersetzen müssen, ersetzen Sie es einfach.

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

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

Bitte überprüfen Sie mein Update, ich habe festgestellt, was ich will, das Ergebnis zu sein. einfach setzen ich will \\ x werden \ x –

+0

Bearbeitete die Antwort. – hyde

+0

Vielen Dank für die Antwort und zusätzliche Kommentare! –

Verwandte Themen