قراءة قصب مختلفة مع نفس الشيء السابق ونفس الكلمة التالية؟qstring :: indexof.

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

  •  09-12-2019
  •  | 
  •  

سؤال

قرأت اثنين من QStrings (Valueone، Valuetwo) من ملف مع (مثال أساسي فقط) giveacodicetagpre.

كما ترى شفرة المصدر لا يمكن أن يتحمل الفرق بين Valueone و Valuetwo فقط عن طريق "البدء" و "النهاية"، لأن كل من Qstring :: MID () طرق (التي تابع الخط حسب الخط بقدر ما أعرف)نفس موضع البداية ونفس الطول (انظر http:// qt-project.ORG / DOC / QT-4.8 / QSTRING.HTML # منتصف ).لذلك اعتقدت إذا كانت السلسلة بأكملها سطر واحد مثل giveacodicetagpre.

يمكنني الاختراف بين القيمتين مع QString S="نعم ابدأ" و QSTRING S2="لا بداية".لذلك سيؤدي تحويل السلسلة المتعددة إلى سلسلة ستيف واحدة يكون حلا وكيف يمكنني القيام بذلك؟أم أن هناك حلا أفضل آخر؟ تحية

هل كانت مفيدة؟

المحلول

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;
}

نصائح أخرى

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()));
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top