2017-09-21 10 views
0

"2323 432 1223"のような形式の単純なQStringを分割する必要があります。処理されている最初の行は、例えば文字列のようなものである場合 iが使用するコードは、私が最初のため を取得QT regressionExpressions数値を取得する

QString line; 
QRegularExpression re("(\\d+)"); 
QRegularExpressionMatch match; 

while(!qtextstream.atEnd()){ 
    line = qtextstream.readLine(); 
    match = re.match(line); 
    std::cout<<"1= "<<match.captured(0).toUtf8().constData()<<std::endl; 
    std::cout<<"2= "<<match.captured(1).toUtf8().constData()<<std::endl; 
    std::cout<<"3= "<<match.captured(2).toUtf8().constData()<<std::endl; 
} 

あるサイクル出力中:

1 = 2323

2 = 2323

3 =

何が問題なのですか?

+0

あなたの主な問題は、1つの一致を1つだけ取得したことです。 *すべての*マッチを取得する必要があります。文字があるかどうかに関わらず、この質問の範囲にはないようです。それ以外は更新してください。 –

+0

あなたの問題を解決した回答がある場合は、受諾/ upvotingを検討してください。そうでない場合は、何が機能していないか、まだ不明な点について説明するコメントを記入してください。 –

答えて

2

あなたの正規表現は1つ以上の数字と一度だけ一致します。re.matchです。最初の2つの値は、グループ0(一致全体)およびグループ1の値(値、キャプチャグループ#1の場合は)です。あなたのパターンには2番目のキャプチャグループがないので、match.captured(2)は空です。

あなたは現在の文字列からすべての一致を得るためにQRegularExpressionMatchIteratorを使用する必要があります。全試合は、あまりにも、アクセスすることができるので(\\d+)は、不必要なキャプチャグループが含まれていることを

QRegularExpressionMatchIterator i = re.globalMatch(line); 
while (i.hasNext()) { 
    qDebug() << i.next().captured(1); // or i.next().captured(0) to see the whole match 
} 

注意。だから、あなたはre("\\d+")を使用して、i.next().captured(0)と全体の一致を得ることができます。

0

正規表現の使用が必須でない場合は、QStringのsplit()-functionも使用できます。

QString str("2323 432 1223"); 
QStringList list = str.split(" "); 
for(int i = 0; i < list.length(); i++){ 
    qDebug() << list.at(i); 
} 
+0

はい、しかしいくつかの行にも文字があります –

+0

はい、しかし、それは分割機能のパラメータとして使用する文字/文字列で分割されている限り、文字列の構成とは無関係です。 – JSilver

+0

例えば234e 2143 gt4355のような行から234 3243 4355を再作成しなければならないのであれば、splitでは234e、2143、gt4355の値を持つ3つのQStringが得られますが、 –

関連する問題