QRegExp -> auftrennen eines QString

Verschiedenes zu Qt
Antworten
Krug-Systems.de
Beiträge: 21
Registriert: 18. März 2007 21:01
Wohnort: Immenstadt
Kontaktdaten:

QRegExp -> auftrennen eines QString

Beitrag von Krug-Systems.de »

Sers,

ich bin grade dabei meine Diplomarbeit zu schreiben und stehe wiedermal vor einem Problem.

ich habe eine Textfile und erzeuge mir aus diesem Einzele QString's einer davon ist :

:arrow: vy20002050171p001 3.1645 vs 30x100x88 Platte(Englisch)Fa.krug

diesen muss ich nach QString typ, QString language und QString service auftrennen, dachte mir mit hilfe von QRegExp. hab aber keine Ahnung wie.

- optional in jedem String sind language und service.
- language steht immer in "() " ---> wenn vorhanden
- service beginnt immer mit "Fa." ---> wenn vorhanden


ich glaub des war momentan mein Problem, zusagen ist auch noch ich habe vor 4 Wochen mit QT4 angefangen (Anfänger :!: )
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Warum so umständlich? Einfach bei den Leerzeichen trennen und fertig.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Was typ sein soll hast du nicht angegeben.
Bei den qtdemo's ist ein Regular-Expression-Demo dabei, damit kann man schön testen...
Mit einer RegEx wirst du das nicht hinkriegen...
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Mit einer nicht, aber es wäre auch blöd es mit einer zu machen. Wenn, dann für Sprache und Service getrennt.
Krug-Systems.de
Beiträge: 21
Registriert: 18. März 2007 21:01
Wohnort: Immenstadt
Kontaktdaten:

Beitrag von Krug-Systems.de »

:arrow: language und service sind auch QString

:arrow: nach leerzeichen trennen geht nicht mach i mir mein String kaputt (brauch ausserdem den 1. Teil QString Typ/ 2. Teil QString Language / 3. Teil Service) :!:
Zuletzt geändert von Krug-Systems.de am 20. März 2007 08:42, insgesamt 2-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Hast Du nicht noch ein paar mehr Smilies gefunden?

Nach '(' scannen bis gefunden, dann bis ')' scannen und schauen ob es Language ist. Der Rest ergibt sich dann per QString::mid()/left()/right()
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
bst
Beiträge: 56
Registriert: 7. November 2006 13:16
Wohnort: Ilsfeld

Beitrag von bst »

Auch Hallo,

ich hätte angenommen, daß mit setMinimal(true) sowas geht:

^(.*)(?:\((.*)\))?(Fa\..*)?$

Tut es aber nicht :-(, warum denn eigentlich ?

Versuchs vielleicht mal mit sowas.

Code: Alles auswählen

#include <QRegExp>
#include <QString>
#include <QDebug>

int main(void)
{
   QString s = "vy20002050171p001 3.1645 vs 30x100x88 Platte(Englisch)Fa.krug";
   //QRegExp rx("^(.*)(?:\\((.*)\\))?(Fa\\..*)?$");
   QRegExp rx("^((?:(?!Fa\\.)[^()])*)(?:\\((.*)\\))?(Fa\\..*)?$");

   //rx.setPatternSyntax(QRegExp::RegExp2);
   //rx.setMinimal(true);

   if (rx.indexIn(s) > -1)
      for (int i=1; i <=3; i++)
         qDebug() << i << rx.cap(i);

   return 0;
}   
cu, Bernd
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

ich hätte angenommen, daß mit setMinimal(true) sowas geht:

^(.*)(?:\((.*)\))?(Fa\..*)?$

Tut es aber nicht, warum denn eigentlich ?
Hatte das selbe gestern schon versucht und die gleiche Feststellungen gemacht, kann aber nicht sagen warum das so ist...
Krug-Systems.de
Beiträge: 21
Registriert: 18. März 2007 21:01
Wohnort: Immenstadt
Kontaktdaten:

Beitrag von Krug-Systems.de »

DANKE Bernd, hast mir enorm viel arbeit abgenommen, jetzt muss ich nur noch die Syntax deiner Expression auseinanderglauben :-)

aber des kann ja nicht so schwer sein.


Dank auch an alle anderen die mir helfen wollten und es auch im gewissen Sinne gemacht haben. :P
bst
Beiträge: 56
Registriert: 7. November 2006 13:16
Wohnort: Ilsfeld

Beitrag von bst »

FYIO,

habe das bei trolltech nachgefragt, Jasmin Blanchette antwortete:
Hi Bernd,

> with setMinimal(true) and the string "abc" I expected the QRegExp "^(.*)(.)?(.)?$" to set the submatches $1=a, $2=b and $3=c.
>
> But it results in $1=abc. Why ?

The minimal matching is "global", i.e. it tries to find the shortest match possible for the entire string. The individual matches within the string are still performed as usual.

I guess this begs the question: Why does't QRegExp support minimal quantifiers, e.g., *? and +?. The short answer is that is very difficult to accomplish with the current regexp engine. In the long term, I'd like us to rewrite the engine (or use a 3rd party engine) so that Qt's regexp support this kind of features and follow some standard (whether it be Perl, JavaScript, POSIX, ...).

Regards,

Jasmin
cu, Bernd
Antworten