QString mittels RegEx trennen

Alles rund um die Programmierung mit Qt
sascha
Beiträge: 37
Registriert: 12. Januar 2006 11:01

QString mittels RegEx trennen

Beitrag von sascha »

Hallo....

Ich habe vergeblich versucht folgenden String zu trennen:

Code: Alles auswählen

[Text] [Text 1 hjh] [jdhasjhdkj]
Dabei möchte ich gerne in der QStringList die Texte, die zwischen den [ ] Klammern stehen bekommen....
Habe das mit QRegEx gemacht, aber scheinbar falsch, denn er liefert immer den gesamten String....

Hat einer von Euch den korrekten RegEx zur Hand?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QString mittels RegEx trennen

Beitrag von Christian81 »

sascha hat geschrieben: Hat einer von Euch den korrekten RegEx zur Hand?
Wie wäre es erstmal mit deiner damit man sieht was Du evtl. falsch gemacht hast?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
sascha
Beiträge: 37
Registriert: 12. Januar 2006 11:01

Beitrag von sascha »

Daran soll es doch nicht hapern....


ich hatte:

Code: Alles auswählen

RegEx("(\\[.*\\])+")
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

sascha hat geschrieben:Daran soll es doch nicht hapern....
Gut, ich wollte nur sicher gehen dass man sich Gedanken gemacht hat :)

Ich würde mal sagen Du ignorierst die Leerzeichen dazwischen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
sascha
Beiträge: 37
Registriert: 12. Januar 2006 11:01

Beitrag von sascha »

Ok das war schon mal ein guter Hinweis....

Allerdings bekomme ich nun die schließende Klammer mit rein:

Code: Alles auswählen

QRegExp("(\\[.*\\]\\W+)+")
Woran kann das denn liegen?
Wäre cool, wenn ich nochmal eine Hilfestellung beommen könnte!

Und danke nochmal...
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

sascha hat geschrieben: Allerdings bekomme ich nun die schließende Klammer mit rein:

Code: Alles auswählen

QRegExp("(\\[.*\\]\\W+)+")
das ist doch super! ... mit einem qstring
str.replace(QString("]"), QString("")); hast du sie auch raus... oder?

wenn ich das hatte machen sollen .... dann alles in einen list... QStringList

QString str = "Arial,Helvetica,Times,Courier";
QStringList list = str.split(",");
// list: ["Arial", "Helvetica", "Times", "Courier"]

splitt (][) in deinem fall... mit space "] [" wenn immer gleich....
sascha
Beiträge: 37
Registriert: 12. Januar 2006 11:01

Beitrag von sascha »

Jau ich mache das auch mit einem QString split, allerdings mit QRegEx als Parameter der Funktion...
Ich dachte mir halt das ich genau das hantieren mit replace dann nicht machen muss....
Aber im Zweifel ist das auch eine Lösung ja...
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

Code: Alles auswählen

string ="[Text] [Text 1 hjh] [jdhasjhdkj]";
string.prepend("] "); /* space after */
string.append(" [");  /* space before */
and dann splitten ..... wie mein beispiel oben..
dann sind sie garantiert sauber ohne [] .....
Zuletzt geändert von patrik08 am 3. Mai 2006 15:51, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Mist, war ein falscher Hinweis - das kommt davon wenn man zu wenig mit RegExp's arbeitet... :(

Damit funktioniert es:

Code: Alles auswählen

QRegExp rx("(?:\\[([^\\]]+)\\])");
QString str="[Text] [Text 1 hjh] [jdhasjhdkj]";
int pos = rx.indexIn(str);
if(pos!=-1) {
	for( pos; (pos = rx.indexIn(str,pos)) != -1; ) {
		fprintf(stderr,"%s\n\n",rx.cap(1).toLatin1().constData());
		pos++;
	}
}
Man muss ja nur festlegen was man will, nicht was sonst noch so rumschwirrt :)
Wenn eine Erklärung der RegExp nötig ist, bitte melden.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
sascha
Beiträge: 37
Registriert: 12. Januar 2006 11:01

Beitrag von sascha »

Christian81 hat geschrieben: Wenn eine Erklärung der RegExp nötig ist, bitte melden.
Das wäre klasse!
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

Christian81 hat geschrieben: Wenn eine Erklärung der RegExp nötig ist, bitte melden.
ich wollte .. lieber von dir wissen ob du die patch msvc_bcc32_412.patch vom qt-win projekt differenziert hast...

da Qlocale immer noch den bug hat auch mit der patch..
QLocale::system().name() immer c wie trolltech bug ...
und dass auf window xp professional mit serie nr MUI Multilingual...
( http://www.stegcomputer.ch/details.asp? ... inxp-p-mui )
und auf normalen win xp it/de komm es richtig
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ok, ich versuchs mal.

Also wir wollen alles innerhalb von []
-> \\[(<irgendwas>)\\]

<irgendwas> kann alles ausser ']' sein
--> [^\\]]+

<irgendwas> wollen wir ausserdem capturen
--> ([^\\]]+)

und jetzt merke ich gerade dass (?: <...> ) gar nicht nötig ist. Dies ist ein grouping ohne dass es gecaptured wird.

--> alles zusammen
(?:\\[([^\\]]+)\\])

wobei eben auch
\\[([^\\]]+)\\]

gehen sollte
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

patrik08 hat geschrieben:
Christian81 hat geschrieben: Wenn eine Erklärung der RegExp nötig ist, bitte melden.
ich wollte .. lieber von dir wissen ob du die patch msvc_bcc32_412.patch vom qt-win projekt differenziert hast...

da Qlocale immer noch den bug hat auch mit der patch..
QLocale::system().name() immer c wie trolltech bug ...
und dass auf window xp professional mit serie nr MUI Multilingual...
( http://www.stegcomputer.ch/details.asp? ... inxp-p-mui )
und auf normalen win xp it/de komm es richtig
Was hat mein Patch mit angeblichen Qt-Bugs zu tun???
Wenn du die Umgebungsvariable 'LANG' auf 'C' gesetzt hast kommt das nunmal zurück... :roll:
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

nein das mui window setz es auf ... IT nur 2 letter... bei eine master installation..

cmd && echo %LANG%

kommt "IT"
und QLocale::system().name() gibt C gross...

soll ich an alle mui window benutzer sagen sie sollen doch bitte it_CH reinschreiben... oder de_DE ..... ??

also ist

getenv("LANG") als zweite abfrage sinnvoller wenn qlocale c gibt... oder?...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Dann ist es ein Windows-Bug.
Wenn 'it' klein wäre würde es korrekt erkannt (gerade getestet).
Und wenn du meinst dass es ein Qt-Bug ist, dann schreib an qt-bugs@trolltech.com
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten