[qt4] QRegExp.cap() bei Quanifiern

con-f-use

Erfahrenes Mitglied
Moin,

mit dem Folgenden QRegExp will ich aus einem String (eignetlich einer Datei) alle Zeilen raussuchen, die dem Pattern ensprechen. Hier sind es jetzt Zeilen, die beliebig viele bzw. gar keine Whitespaces an Zeilenanfang und -ende haben können. Dazwischen sind genau fünf Zahlen, die durch beliebig viele Whitespaces getrennt werden. Der echte RegExp ist natürlich etwas komplizierter.

Soweit ist das kein Problem. Nun hätte ich aber gerne noch zusätzlich die einzelnen Zahlen, die durch das (\\d) gematcht werden und zwar alle fünf pro Zeile (in der ersten wären das als "1", "3", "2" und "4" ).
C:
#include <QRegExp>
#include <QString>
#include <QStrinList>

QString inputString = "foo\n  1\t 3\t\t2 4\t \t5\n9 7 8 6 10\nbar";
QRegExp testPattern("^(\\s*(\\d)){5}\\s*$");

/* Folgende Zeile entfällt natürlich im Originalscript, 
 * weil ich die Datei zeilenweise auslese */
    QStrinList lines = inputString.split("\n");

for(int i=0; i<lines.size(); ++i) {
    if( testPattern.indexIn( lines.at(i)) > -1 ) {
        // Hier hätte ich gerne die einzelnen digits aus testPattern
    }
}
Über die capturedText()-Funktion scheint das aber nicht zu gehen. Es wird immer nur die letzte Zahl einer Zeile zurück gegeben - die anderen sind anscheinend nicht gespeichert.
Ich würde aus Performance-Gründen ungern eine zweite Schleife einbauen in der ich dann nochma die einzelnen Zahlen extrahiere. Das erschiene mir auch etwas unschön, weil ja eigentlich die Zahlen schon gematcht sind.
Mein Frage ist jetzt: Gibt es eine Möglichkeit an die bereits in testPattern gematchten digits ranzukommen?

Danke und Gruß
von con-f-use
 
Zuletzt bearbeitet:
Hi

ich glaub das ist nicht möglich alle CapturedTexts rauszuholen.

Gibt da nur 2 Möglichkeiten:
entweder du passt das Pattern an
Code:
^\\s*(\\d+)\\s*(\\d+)\\s*(\\d+)\\s*(\\d+)\\s*(\\d+)\\s*$

oder du machst es inner Schleife (so stehts in der Dokumentation)

Code:
QRegExp rx("(\\d+)");
 QString str = "Offsets: 12 14 99 231 7";
 QStringList list;
 int pos = 0;

 while ((pos = rx.indexIn(str, pos)) != -1) {
     list << rx.cap(1);
     pos += rx.matchedLength();
 }
 
Erstmal vielen Dank. Auf beide Ideen bin ich auch schon gekommen. Pattern anpassen hat aus einem komischen Grund nicht geklappt. Denke mal ich werd's in einer Schleife machen müssen.

Hatte gehofft jemand hätte noch einen Trick parat oder eine Funktion oder eine alternative RegExp-Bibliothek.
 
Zurück