2012-03-07 2 views
1

Я написал исходный код, как:Как указать метод QString :: indexOf?

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» »? привет

ответ

4

Декларация IndexOf из QString заключается в следующем:

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

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

int from = 0 

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

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

Честно говоря, у меня уже была такая же идея: D - просто использовал «start + s.length()» вместо «start». Это также помогло, но оно не решило проблему, потому что по-прежнему существует множество «концов» после появления «начала» QString. – Streight

+0

Но разве вам не нужно первое вхождение слова «конец» после слова «начало»? Если вы хотите сделать еще одну вещь, достаточно просто понять, можем ли мы помочь :) – unbekant

+0

Невозможно выполнить эту работу с Qt Api. Поэтому я предлагаю вам использовать цикл для этой работы, например, найти второй ** start **, а затем найти второй ** конец ** после этого. Если ваш текст более сложный, чем этот случай, вы должны использовать лексер (ручной текст, инструменты). – softghost

0

Если кто-то хочет осуществить поиск с рисунком

BEGIN_WHATEVER_END, так гораздо лучше использовать следующий Regex.

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 

    } 
} 
Смежные вопросы