2012-03-01 37 views
0

テキストファイルからいくつかの文字列を取り出したいと思っています。私はQStringのテキストの下にあるすべてのテキストを取得するために正常に動作しQtライブラリを使ってテキストファイルから文字列を取り出す方法

QTextStream Stream (GEO); 
QString text;  
do  
{  
text = Stream.readLine(); 

} 
while(!text.isNull()); 

でテキストファイルの文字列全体を取得する方法を知っているが、私はちょうど、模式のようなテキストのうち、いくつかの特定の文字列を必要とする:

if the text "start" appears in the Qstring text (or the QTextStream Stream) 

save the following text under QString First 

until the text "end" appears 

誰かがこれを行う方法を教えてもらえますか、それとも私に小さな例を教えてもらえますか?

答えて

1
あなたが使用できることの一つは、(のindexOfで「開始」と「終了」のインデックスを取得することです

)だけを使用します。

QString x = "start some text here end"; 
QString s = "start"; 
QString e = "end" 
int start = x.indexOf(s, 0, Qt::CaseInsensitive); // returns the first encounter of the string 
int end = x.indexOf(e, Qt::CaseInsensitive); // returns 21 

if(start != -1) // we found it 
    QString y = x.mid(start + s.length(), end); 

またはmidRef新しいリストを作成したくない場合。あなたは "終わり"も処理しなければならないかもしれません。そうでなければ何も返さない0から-1まで行くかもしれません。たぶん(終了>開始?終了:開始)

編集:Nevermind。終了== -1の場合は、終了まですべてを返します(デフォルトでは2番目のパラメータは-1)。これを望んでいない場合は、代わりに私の例を使用して、 "終了"を選択するときにif文を使用することができます。

編集:私はドキュメントを見落としてしまいました。仕事:

#include <QDebug> 

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

これは、以下のresoultsを生成します。最後の2つの数字は、「開始」が終了し、「終了」が始まるところです。

X = "終了いくつかのテキストをここに" 5 16

X = => "ここにいくつかのテキストを" "終了ここにいくつかのテキストを開始" =>なしoutprint

X =「テスト開始開始いくつかのテキストはここで終わり」=> 『ここにいくつかのテキストを開始する』 13 22

X = 『テストはここにいくつかのテキストを開始する』 => 『ここにいくつかのテキストを開始開始』 13 -14

またはあなたが行うことができますそれによってregExを使用します。あなたのためにここに非常に単純なスニペットを書いた:

#include <QDebug> 
#include <QRegExp> 

int main(int argc, char *argv[]) { 
    QRegExp rxlen("(start)(.*(?=$|end))"); 
    rxlen.setMinimal(true); // it's lazy which means that if it finds "end" it stops and not trying to find "$" which is the end of the string 
    int pos = rxlen.indexIn("test start testing some text start here fdsfdsfdsend test "); 

    if (pos > -1) { // if the string matched, which means that "start" will be in it, followed by a string 
     qDebug() << rxlen.cap(2); // " testing some text start here fdsfdsfds" 
    } 
} 

これが最後に「終了」を持って、あなたが行っても、それだけで行の末尾に解析し動作します。楽しい!

+0

答えのためのthx。 http://qt-project.org/doc/qt-4.8/qstring.html#mid私はちょうど "終わり"に問題があります。なぜなら、ドキュメンタリーでは、2番目の引数(あなたの例ではn - > "end")は、最初の引数 "start + s.length()"から返される文字数です。したがって、最初の引数が開始位置/インデックス(ok)の場合、2番目の文字列は "end"のインデックス/位置に等しい文字列の文字数になります。問題を最終的に解決する方法を教えてください。そうでなければ、 "s.length()" greetingを使って本当に良いアイデアを考えてみてください。 – Streight

+0

私は第2引数 "end - (start + s.length)"が正しくなければなりません。私は次の日の時間があるときにそれをテストし、それがうまくいくならあなたの答えを受け入れます。 – Streight

+0

こんにちは、すみません。私の編集版を読んでください。また、それをテストし、助けのための出力 – chikuba

関連する問題