Seite 1 von 1
QString::split() mit QregExp [gelöst]
Verfasst: 14. Juli 2010 12:59
von Whitefurrows
Hallo,
kann mir jemand helfen die folgende Strings zu splitten, die zeilenweise eingelesen werden?
"Zeile 1";"Im Text ""Textzeichen"" und Semikolon;";"2010-07-14"; 15
"Zeile 2";2;4.15;1.00
"Zeile 3";10.40;0.00;0
Pro Zeile möchte ich dann eine StringList mit den Werten der Einzelnen Felder. Als Trennzeichen für die Felder wir das Semikolon ";" verwendet. In einem Feld ist Text durch ein Anführungszeichen markiert. Kommt ein Anführungszeichen im Text vor, ist dieses verdoppelt, wie bei dem String aus Zeile 1.
Kann mir jemand sagen wie eine entsprechende QregExp aussieht um die Strings zu splitten?
Verfasst: 14. Juli 2010 13:33
von kater
QStringList QString::split(";") sollte doch langen oder? Zumindest um die Teile die mit einem ";" getrennt sind zu splitten. Den Rest hab ich nicht verstanden.
Verfasst: 14. Juli 2010 13:57
von Whitefurrows
Nein, leider genügt QStringList QString::split(";") nicht. Weil wenn in einem Text gekennzeichneten Feld wie in Zeile 1 ein Semikolon vorkommt wird zu früh getrennt.
Beispiel für Zeile 1 mit QString::split(";") :
1.) "Zeile 1"
2.) "Im Text ""Textzeichen"" und Semikolon
3.) "
4.) "2010-07-14"
5.) 15
Aussehen soll es aber so:
1.) "Zeile 1"
2.) "Im Text ""Textzeichen"" und Semikolon;"
3.) "2010-07-14"
4.) 15
Ideal wäre es, wenn beim splitten auch gleich die Anführungszeichen für die Kennzeichnung von Textfeldern entfernt werden könnte, damit die Liste dann so aussieht:
1.) Zeile 1
2.) Im Text "Textzeichen" und Semikolon;
3.) 2010-07-14
4.) 15
Verfasst: 14. Juli 2010 17:24
von Whitefurrows
Falls es jemand interessiert ich habe jetzt eine RegExp gefunden mit der es geht und die sieht so aus:
("([^"]*|"{2})*"(;|$))|"[^"]*"(;|$)|[^;]+(;|$)|(;)
Verfasst: 15. Juli 2010 14:16
von Whitefurrows
Leider kann ich die RegExp nicht ändern, weil ich nicht verstehe was sie mach:
("([^"]*|"{2})*"(;|$))|"[^"]*"(;|$)|[^;]+(;|$)|(;)
Kann mir jemand helfen, sie so zu verändern, das ggf. gleich das Anführungszeichen am Anfang und am Ende inklusive Trennzeichen entfernt wird?
Also in der Ersten Zeile
"Zeile 1";"Im Text ""Textzeichen"" und Semikolon;";"2010-07-14"; 15
erhalte ich als erstes
"Zeile 1";
ich möchte aber nur
Zeile 1
Wie muss ich dazu die RegExp ändern?
Verfasst: 15. Juli 2010 15:40
von Christian81
Wie man sieht sind RegExps nicht immer der Weisheit letzter Schluss - schon gar nicht wenn man sie nur sehr selten benutzt. Schreib einen einfachen Parser - da wärst Du wohl schon längst fertig...
Verfasst: 16. Juli 2010 10:00
von Whitefurrows
Was ist mit einem Parser gemeint? Die Strings von Hand zu zerlegen? Wüste jetzt nicht wie das viel besser gehen sollte! Ich habe jetzt einfach die RegExp genutzt und dann die Zeichen am Anfang/Ende entfernt und die doppelten Anführungszeichen ersetzt.
Falls jemand versteht wie die RegExp funktioniert, würde ich mich dennoch über eine kurze Erklärung freuen, auch wenn es vielleicht ohne besser geht.
Verfasst: 16. Juli 2010 12:27
von padreigh
siehe QRegExp - Hilfe :
http://doc.trolltech.com/4.6/qregexp.html#details
Code: Alles auswählen
("([^"]*|"{2})*"(;|$))|"[^"]*"(;|$)|[^;]+(;|$)|(;)
Anführungszeichen
gefolgt von
[optional 0 bis n mal] NICHTanführungszeichen ODER 2 Anführungszeichen
gefolgt von
Anführungszeichen
gefolgt von
Semikolon ODER Stringende
ODER
Anführungszeichen
gefolgt von
[optional 0 bis n mal] NICHTanführungszeichen
gefolgt von
Anführungszeichen
gefolgt von
Semikolon ODER Stringende
ODER
[1 bis n mal] NICHTsemikolon
gefolgt von
Semikolon ODER Stringende
ODER
Semikolon
Erklärung:
() sind gruppierungen,
(aaa|bb) heisst entweder aaa oder bb
[abcd] entweder a oder b oder c oder d
[^abcd] alles ausser a oder b oder c oder d
^ ist (meistens) der Zeilenanfang es sei denn es ist das erste zeichen in einer [] (s.o.)
$ ist das Zeilenende
Quantifizierung:
{x} ist eine Quantifizierung (== x mal)
* ist eine Quantifizierung (0 bis unendlich = egal wie oft, kann da sein oder auch nicht)
+ ist eine Quantifizierung (1 bis unendlich = mindestens ein mal
Verfasst: 18. Juli 2010 20:56
von Whitefurrows
Vielen dank an alle! Die RegExp wurde sehr schön erklärt, hat mir sehr geholfen, Danke!