2012-03-08 6 views
0

私は次のようにソースコードを書かれている:ここQString :: indexOfメソッドを2単語間のスペースの数に敏感でないように指定する方法はありますか?

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

}

私の問題は、int型エンド= FileText.indexOf(E、Qtの:: CASEINSENSITIVE)ということ、です。 とQString e = "end here";は、単語 "end"と "here"の間に正確に3つのスペースがある場合にのみ見つかります。私が読んだテキストでは、これらの2つの単語の間のスペースが確かに時々違いますから、これは問題である。さらに、私は "終わり"と "ここ"の両方の言葉を書く必要があります。問題を根本的に減らそうとしましたが、誰かがアイデアや解決策を持っていることを願っています。

+0

あなただけの「ここで終わり」と自分のストリームに「スタート」ののoccuranceを探していますか? –

+0

私はそれらを探していて、その後、 ".mid()メソッド"でそれらの間に何を抽出しますか?確かに私はもっと多くの文字列を抽出しなければならないので、ストリーム/テキストでもっと多くの単語を検索しなければなりません。 – Streight

答えて

3

メソッドを使用して、スペース間の数を1に減らします。

+0

QString FileTextでQString :: simplifiedを使用して、2つの単語間のスペースがすべて1つのスペースに縮小されるようにする必要がありますか?それは私に悪いので、それはまた2行を組み立てるでしょうか?一方、私はそれがxDでも重要かどうかはわかりません - 私はそれを試してみましょう... – Streight

+0

うーん、私はいくつかの方法でそれを試して、それは動作しませんでした。 "do command"の前に "FileText = FileText.simplified();"と入力しましたが、もう一度Stringを取得しませんでした。 (?) – Streight

+0

@Streight "do command"の前に?それは後になるはずです。 'FileText = Stream.readLine()'の後に 'FileText = FileText.simplified();'を追加する必要があります。 – 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

関連する問題