2012-03-08 3 views
0

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

int main(int argc, char *argv[]) { 
    QFile File (directory + "/File"); 

     if(File.open(QIODevice::ReadOnly | QIODevice::Text)) 
     { 
     QTextStream Stream (&File); 
     QString FileText; 
      do 
      { 
     FileText = Stream.readLine(); 
    QString s = "start"; 
    QString e = "end here"; 
    int start = FileText.indexOf(s, 0, Qt::CaseInsensitive); 
    int end = FileText.indexOf(e, Qt::CaseInsensitive); 

    if(start != -1){ // we found it 

     QString y = FileText.mid(start + s.length(), (end - (start + s.length()))); 

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

}

Моя проблема здесь в том, что ИНТ конец = FileText.indexOf (е, Qt :: CaseInsensitive); с QString e = "end here"; находится только в том случае, когда между словом «конец» и «здесь» существует ровно три пробела. Это проблематично, потому что в тексте, который я читал, промежутки между этими двумя словами будут время от времени отличаться. Кроме того, мне нужно написать оба слова «конец» и «здесь». Я попытался свести проблему к основанию и надеюсь, что у кого-то есть идея/решение.

+0

вы просто ищете вхождение в «заканчивается» и «начать» в вашем потоке? –

+0

Я ищу их, и после этого извлеките что-то между ними методом «.mid()». Конечно, мне нужно искать еще много слов в моем потоке/тексте, потому что мне нужно извлечь еще много строк. – Streight

ответ

3

Уменьшите количество межкомнатных мест до 1, используя метод .

+0

Вы имеете в виду, что я должен использовать QString :: упрощенное в QString FileText, чтобы все пробелы между двумя словами были сведены к одному пространству? Будет ли это также собирать две линии, потому что это было бы плохо для меня? С другой стороны, я не уверен, что это даже вопрос xD - я просто попробую ... – Streight

+0

Хммм, я попробовал это с помощью нескольких методов, и это не сработало. Перед «do command» я набрал «FileText = FileText.simplified();» но я снова не получил строку. (?) – Streight

+0

@Streight Перед тем, как «сделать команду»? Это должно быть после (или в)! Вы должны добавить 'FileText = FileText.simplified();' после 'FileText = Stream.readLine()'. – sgibb

3

Вы также можете попробовать QRegExp:

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

int main() 
{ 
    QString text("start ABCDE1234?!-: end here foo bar"); 

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

    int pos=0; 

    // look for possible matches 
    while ((pos=rx.indexIn(text, pos)) != -1) { 
     qDebug() << rx.cap(1); // get first match in (.+) 
     pos+=rx.matchedLength(); 
    } 

    return 0; 
} 
+0

Угадайте, что это тоже сработало бы хорошо, но я сделал это сейчас по-другому. Привет – Streight

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