Anzeige:
Ergebnis 1 bis 6 von 6

Thema: QRegExp inhalt von Tags

  1. #1
    Registrierter Benutzer
    Registriert seit
    02.08.2008
    Beiträge
    177

    QRegExp inhalt von Tags

    Hi,

    ich versuche schon seit über einen Monat einen Weg zu finden, wie ich aus
    einem Dokument mit den Tags:
    Code:
    <html>
    ...
    <body>
    ...
    <TR><TD><zutat>Möhre</zutat></TD></TR>
    <TR><TD><zutat>Kartoffel</zutat></TD></TR>
    <TR><TD><zutat>Zwiebel</zutat></TD></TR>
    <TR><TD><zutat>1...n</zutat></TD></TR>
    ...
    </body>
    </html>
    die Zutaten in eine Stringlist bekomme.
    Mein Hauptversuch dabei war:

    Code:
    QRegExp exp;
    exp.setPattern(".*<zutat>(.*)</zutat>.*");
    exp.exactMatch(str);
    doch es klappt einfach nicht, egal was ich mache.
    Deshalb wollte ich Euch um Eure Hilfe bitten.

    vielen Dank!
    grüße
    dml

  2. #2
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Qt Regexe habe ich noch nie verwendet, aber zwei Dinge kommen mir seltsam vor, erstens, das du exactMatch verwendest und nicht die "Index"-Funktionen und zweitens beginnt dein Ausdruck schon mit Punkt-Sternchen, was bedeutet ein beliebiges Zeichen beliebig oft zu matchen. Mit anderen Worten, jeden String. Das kommt mir nicht richtig vor.

  3. #3
    Registrierter Benutzer
    Registriert seit
    02.08.2008
    Beiträge
    177
    Ja, ich habe es auch schon mit
    Code:
     while ((pos = exp.indexIn(str_recipe, pos)) != -1) {
    	categories << exp.cap(1);
    	qDebug()<<endl<<" exp.cap(1)="<<exp.cap(1);
    	pos += exp.matchedLength();
    }
    versucht.
    Doch entweder er schreibt die gesamte html Datei hinnein, oder er findet das Ende nicht.
    Wenn ich nur eine einzige Zutat habe, funktioniert es wunderbar, nur ab zwei funktioniert es nicht mehr.

    Ansonsten weiß ich leider nicht was ich anstatt des .* verwenden kann, da es ja undefiniert ist.
    Geändert von dml (06-09-2009 um 17:32 Uhr)

  4. #4
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Dafür gibt es QDomDocument oder QXmlQuery, damit ist das ein klacks
    QXmlQuery query;
    query.setQuery("doc('index.html')/html/body/TABLE/TR/TD/zutat[1]");
    Geändert von undefined (06-09-2009 um 18:00 Uhr)
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  5. #5
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Ok, das mit dem .* am Anfang klappt sogar, wußte ich gar nicht, so selten wie ich Regexe verwende.

    Ist aber auch unnötig, wenn du QRegExp::indexIn verwendest.

    Andererseits, .* als Captured Subexpression wird bestimmt nicht funktionieren, wenn du mehrere Tags einzeln matchen möchtest. Denn dann fängt er mit dem ersten Tag an, captured alle mittleren und hört erst mit dem letzen auf. Wenn du dich in der Subexpression auf weniger Zeichen beschränkst, dann sollte es funktionieren.

    Hier mal Code, der bei mir funktioniert:
    #include <algorithm>
    #include <fstream>
    #include <iostream>
    #include <iterator>
    #include <ostream>
    #include <vector>

    #include <stdlib.h>

    #include "QtCore/QRegExp"
    #include "QtCore/QString"
    #include "QtCore/QStringList"

    int main()
    {
    std::ifstream infile("qt_regex_data.txt");
    if(!infile)
    {
    std::cerr << "Failed to open input file!\n";
    return EXIT_FAILURE;
    }

    std::vector<char> v;
    std::copy(std::istreambuf_iterator<char>(infile.rd buf()), std::istreambuf_iterator<char>(), std::back_inserter(v) );
    if(!infile)
    {
    std::cerr << "Failed to read all input!\n";
    return EXIT_FAILURE;
    }
    v.push_back('\0');

    std::cout << "Data:\n" << v.data() << "\n-------------------\n";

    QString instring(QString::fromLatin1(v.data()) );

    QRegExp regex("<zu>([a-zA-z \\d]*)</zu>");
    //QRegExp regex("<zu>(.*)</zu>");

    if(regex.exactMatch(instring) )
    {
    std::cout << "Complete String matches.\n";
    return 0;
    }

    int idx = 0;
    while((idx = regex.indexIn(instring, idx)) != -1)
    {
    std::cout << "Match at offset " << idx << " of length " << regex.matchedLength()
    << ", captured = " << regex.capturedTexts().at(1).toLatin1().data() << ".\n";
    idx += regex.matchedLength();
    }
    }

    ---------------------------------------------

    und Test Daten:
    <zu>abc</zu>
    klsaf
    <zu>xy</zu>
    b
    ------------------------------------------------

    Geht das?

  6. #6
    Registrierter Benutzer
    Registriert seit
    02.08.2008
    Beiträge
    177
    Code:
    exp.setPattern("<zutat>([\\w\\s]+)</zutat>");
    hat geholfen.
    Vielen dank locus vivendi!
    Auch Dir undefined, bitte nicht sauer sein, wenn ich mal ein wenig fauler bin.

    Vielen Dank, ich saß wirklich lange an diesem Problem.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •