Seite 1 von 1
QRegExp -> auftrennen eines QString
Verfasst: 19. März 2007 16:12
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 :

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

)
Verfasst: 19. März 2007 16:26
von Christian81
Warum so umständlich? Einfach bei den Leerzeichen trennen und fertig.
Verfasst: 19. März 2007 19:40
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...
Verfasst: 20. März 2007 07:27
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.
Verfasst: 20. März 2007 08:12
von Krug-Systems.de

language und service sind auch QString

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)

Verfasst: 20. März 2007 08:17
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()
Verfasst: 20. März 2007 11:27
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
Verfasst: 20. März 2007 12:15
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...
Verfasst: 20. März 2007 12:33
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.

Verfasst: 21. März 2007 15:10
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