Lesen Sie verschiedene Qstrings mit demselben vorherigen und demselben folgenden Wort?QString :: Indexof.

StackOverflow https://stackoverflow.com//questions/9626952

  •  09-12-2019
  •  | 
  •  

Frage

Ich lese zwei Qstrings (value ein, valuewo) aus einer Datei mit (nur ein einfaches Beispiel) generasacodicetagpre.

Wie Sie sehen, dass der Quellcode nicht zwischen ValueMone und Valuetwo nur von "Start" und "End" unterscheiden kann, da sowohl QString :: Mid () -Methoden (welche Zeile nach Zeile so weit wie ich wissen)Dieselbe Startposition und die gleiche Länge (siehe http:// qt-projekt.org / doc / qt-4.8 / qstring.html # Mid ).Daher dachte ich, ob die gesamte Saite eine Linie wie war generasacodicetagpre.

Ich könnte zwischen den beiden Werten mit QString S="YES Start" und QString S2="NO START" unterscheiden.Also würde die Multiline-Zeichenfolge in eine Line-Zeichenfolge konvertieren, und wie kann ich das tun?Oder gibt es eine andere vielleicht bessere Lösung? Grüße

War es hilfreich?

Lösung

As I already mention in your other question I would prefer QRegExp. It seems to be more readable.

If your first string is the 2n value always and your second string is 2n+1 you could use the modulo operator:

#include <QDebug>
#include <QString>
#include <QStringList>
#include <QRegExp>

int main()
{
    QString x = ("yes \nstart ValueOne end \nno \nstart ValueTwo end\n"
                "yes \nstart ValueThree end \nno \nstart ValueFour end ");

    QStringList y1;
    QStringList y2;

    // create regular expression
    QRegExp rx("start\\s+(.+)\\s+end\\s+", Qt::CaseInsensitive);

    // don't try to get the largest match (start ValueOne ... ValueFour end)
    // minimal match should be (start ValueOne end)
    rx.setMinimal(true);

    int pos=0;
    int i=0; // counter

    // look for possible matches
    QString match;
    while ((pos=rx.indexIn(x, pos)) != -1) {
        i+=1; // increase counter for every match
        match=rx.cap(1); // get first match in (.+)

        // use modulo to distinguish between y1/y2    
        if (i % 2) {
            y1 << match;
        } else {
            y2 << match;
        }

        pos+=rx.matchedLength();
    }

    qDebug() << "y1:" << y1;
    qDebug() << "y2:" << y2;

    return 0;
}

Andere Tipps

With something similar to the code below you could find all the strings between "start" and "end". Put the search for "start" and "end" in a loop and use the offset parameter of indexOf to continue searching for new delimiters after the first one.

int main(int argc, char *argv[]) {
    QString x = ("yes /nstart ValueOne end /nno /nstart ValueTwo end ");

    QString s = "start";
    QString e = "end";

    // Look for all the strings between "start" and "end"    
    for(int offset(0); offset < x.length(); )
    {
        // Search for "start" starts from offset
        int start = x.indexOf(s, offset, Qt::CaseInsensitive); 

        if(start < 0){
            break;
        }

        // Search for "end" starts from the position of "start"
        int end = x.indexOf(e, start, Qt::CaseInsensitive); 
        if(end < 0){
            break;
        }

        // Next search for "start" will start from the current position of "end"
        offset = end;

        QString y = x.mid(start + s.length(), (end - (start + s.length()))); 
        qDebug() << y << (start + s.length()) << (end - (start + s.length()));
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top