QRegExp Problem

Alles rund um die Programmierung mit Qt
Antworten
moggi
Beiträge: 7
Registriert: 7. März 2010 02:36

QRegExp Problem

Beitrag 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();

Zuletzt geändert von moggi am 28. März 2010 18:05, insgesamt 1-mal geändert.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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*$
moggi
Beiträge: 7
Registriert: 7. März 2010 02:36

Beitrag 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.
moggi
Beiträge: 7
Registriert: 7. März 2010 02:36

Beitrag 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
Antworten