Seite 1 von 1

QRegExp Problem

Verfasst: 28. März 2010 03:58
von moggi
Hi,

ich hab eine Log Datei die 2 Zeile mit der Anzahl an Fehler bzw Warnungen enthält. Jedoch klappt das ganze nicht ordentlich. Die Zeile: if(regexp.indexIn(temp)!=-1) liefert meistens false, jedoch werden die nachflgenden Anweisungen trotzdem ausgeführt. Desweiteren wird bei der richtigen Zeile der Form:"Number of errors : 26" die while schleife auch nicht abgebrochen.

Erkennt irgendjemanden meine Denkfehler?

Code: Alles auswählen

    
    QString vergleich;
    QString target;
    QString temp;
    QRegExp regexp;


    switch(typ)
    {
    case 0:
        regexp.setPattern("(Number of errors(\s*):)(\d+)");
        vergleich="Number of errors:";
        break;
    case 1:
        regexp.setPattern("(Number of warnings:\s*)(\d+)");
        vergleich="Number of warnings:";
        break;
    }
    if (xst.open(QFile::ReadOnly)) {
         QTextStream in(&xst);

         do
         {
             temp=in.readLine();
             if (regexp.indexIn(temp)!=-1);
             {
                 qDebug()<<(regexp.indexIn(temp)!=-1);
                 qDebug()<<regexp.indexIn(temp);
                 target=temp;
                 qDebug()<<temp;
                 for (int i=0;i<=regexp.captureCount();i++)
                     qDebug()<<regexp.cap(i);
             }
             if (in.atEnd()) break;
         } while(regexp.indexIn(temp)==-1);
     }
    qDebug()<< regexp.captureCount();
    return regexp.cap(3).toInt();


Verfasst: 28. März 2010 10:29
von franzf
Deine Pattern für Warning und Error sind ja unterschiedlich, ist dir das bewusst?
Desweiteren wäre nicht schlecht, wenn du uns mal nen Auszug aus deinem Log liefern könntest, denn ohne konkretem String kein passender Pattern :P

Desweiteren würde ich die Abbruchbedingung der Schleife anders legen:

Code: Alles auswählen

while( !in.atEnd() ) {
    temp = in.readLine();
    // process...
}
Es hat nämlich wenig Sinn, zweimal "regexp.indexIn(temp)" abzufragen (als Abbruchbedingung und in der Schleife nochmal), aber das entscheidende - Datei zu Ende! - nur mit einem Break abzuhandlen.

Und zu guter letzt brauchst du den "QString temp" doch nicht außerhalb der Schleife - deshalb kannst du ihn auch erst da deklarieren. Brauchst ihn ja nach der Schleife nicht mehr, oder?

Verfasst: 28. März 2010 11:11
von upsala
Die beiden Strings können nicht matchen:

Code: Alles auswählen

Number of errors : 26
^(Number of errors(\s*):)(\d+)
Wäre so etwas nicht sinnvoller:

Code: Alles auswählen

errors.*(\d+)\s*$

Verfasst: 28. März 2010 16:13
von moggi
Hi,

treten keine Fehler auf, so sehen die gesuchten Zeilen in der Log Datei so aus:
Number of errors: 0
Number of warnings: 0

treten jedoch Fehler auf, so sehen die Zeilen so aus:
Number of errors : 71
Number of warnings : 0

Jedoch ist das seltsame, das die 4 Debug Anweisungen bei Zeilen die nicht in Ordnung sind folgendes ausgibt:
false
-1
"Design Summary"
""
""
""
false
-1
"--------------"
""
""
""
false
-1
"Number of errors : 71"
""
""
""
false
-1
"Number of warnings : 0"
""
""
""
2
Und laut dieser Ausgabe dürften die Anweisungen ja gar nicht ausgeführt werden.

Verfasst: 28. März 2010 19:36
von moggi
Hi,

ich hab meine Fehler gefunden. Für alle die ähnliche Probleme haben:

Man darf nicht vergessen die Backslashs zu verdoppeln.

Die Zeile sieht also richtig so aus:

Code: Alles auswählen

regexp.setPattern("(Number of errors\\s*:\\s*)(\\d+)");
Der Fehler das die if Anweisung ausgeführt wird trotz falscher Bedingung liegt an dem Semikolon das sich ausversehen eingeschlichen hat.

Vielen Dank für eure Hilfe