Как указать метод QString :: indexOf? - PullRequest
2 голосов
/ 08 марта 2012

Я написал исходный код, например:

    int main(int argc, char *argv[]) {
        QString x = "start some text here end";
        QString s = "start";
        QString e = "end";
        int start = x.indexOf(s, 0, Qt::CaseInsensitive); 
        int end = x.indexOf(e, Qt::CaseInsensitive); 

        if(start != -1){ // we found it
            QString y = x.mid(start + s.length(), ((end - (start + s.length())) > -1 ? (end - (start + s.length())) : -1)); // if you dont wanna pass in a number less than -1
            or
            QString y = x.mid(start + s.length(), (end - (start + s.length()))); // should not be any issues passing in a number less than -1, still works

            qDebug() << y << (start + s.length()) << (end - (start + s.length()));
        }

}

Проблема в том, что в моем текстовом файле слово "конец" встречается очень часто.Итак, есть ли способ создать метод indexOf, который просто ищет FIRST "QString e =" end "", который появляется после "QString s =" start ""?привет

Ответы [ 2 ]

5 голосов
/ 08 марта 2012

Объявление indexOf для QString выглядит следующим образом:

int QString::indexOf ( const QString & str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const

Если вы посмотрите, вы увидите, что есть еще один параметр, который вы используете при вызове indexOf.Это связано с тем, что оно имеет значение по умолчанию и является аргументом:

int from = 0

Это значение по умолчанию установлено равным 0, так что всякий раз, когда вы пропускаете это значение, поиск выполняется с начала строки, новы можете установить его значение на индекс, где вы нашли слово «начало», вот так:

int start = x.indexOf(s, 0, Qt::CaseInsensitive); 
int end = x.indexOf(e, start, Qt::CaseInsensitive); //notice the use of start as the 'from' argument

Таким образом, вы получите индекс первого слова «конец», которое следует послеслово «старт».Надеюсь, это поможет!

0 голосов
/ 12 июня 2013

Если кто-то еще хочет реализовать поиск по шаблону

BEGIN_WHATEVER_END , гораздо лучше использовать следующее регулярное выражение.

QString TEXT("...YOUR_CONTENT...");
QRegExp rx("\\<\\?(.*)\\?\\>"); // match <?whatever?>
rx.setMinimal(true); // it will stop at the first ocurrence of END (?>) after match BEGIN (<?)

int pos = 0;    // where we are in the string
int count = 0;  // how many we have counted

while (pos >= 0) {// pos = -1 means there is not another match

    pos = rx.indexIn(TEXT, pos); // call the method to try match on variable TEXT (QString) 
    if(pos > 0){//if was found something

        ++count;
        QString strSomething = rx.cap(1);
        // cap(0) means all match
       // cap(1) means the firsrt ocurrence inside brackets

        pos += strSomething.length(); // now pos start after the last ocurrence

    }
}
...