2012-02-17 4 views
2

数値データを含むテキストファイルを解析しようとしています。私はC++正規表現にマッチする全行

129.3 72.7 121.6 173.6 203.3 120.7 40.5 79.2 94.0 123.2 165.8 178.8 135.5 78.5 66.2

が、ラインの長さは異なるように見えるラインがたくさんあります。各行の前にはいくつかのスペースもあります。 正規表現を使って行を解析し、各番号を後で操作できる配列に配置したいと思います。

std::getline(is, line); 

std::tr1::regex rx("[0-9-\.]+"); 
std::tr1::cmatch res; 
std::tr1::regex_search(line.c_str(), res, rx); 

を使用する最初の番号と一致します。代わりに、私は、このような

"^[0-9-\.]+$" 
"^[0-9-\.]+" 

としてラインアンカーを使用している場合、私は試合何を取得しないと

"[0-9-\.]+$" 

は、ちょうど最後の番号と一致します。だから私はおそらく何か間違っている。助けてくれてありがとう。

+0

resは配列です。つまり、res [1]、res [2]、res [3] ...は一致する必要があります。あなたはそれをチェックしたのですか? –

+0

regexpは本当に最適な解決策ではありません。単に浮動小数点演算子>>を使用するほうがずっと使いやすく、はるかに適しています。 – PlasmaHH

+0

私はPlasmaHHに同意しますが、誰かが理由を知っていますが、誰かが正規表現を使ってプレイしたいと思っています... –

答えて

2

あの、擬似コード

for str in strtok(input string) 
    vector[index] = convert str to float 

はここストリーム魔法の多くを使用した例です: Splitting a string by whitespace in c++

しかし、昔ながらのはstrtokは、おそらく最も簡単です::Split a string in C++?

はここでベクトルを使った例です http://www.cplusplus.com/reference/clibrary/cstring/strtok/

電子あなたはそれが非常に私はC++のための練習の外だからのようなCのですが、キーポイントはここに正規表現を使用しようとすることで、あなたはそれがovercomplicated作ることで、今

Vector flts = // create it 
for(int ix=0, char * cp; cp = strtok(str," "); ix++){ 
    flts[ix] = atof(cp); 
} 

ような何かを得るでしょう。

+0

が合意され、strtokが最高です! – macduff

+0

確かに、標準規格とスレッド安全のどちらかを選択しなければならない場合、strtokが勝ちます! – jkerian

+0

これはC++ではなくcです。 –

0

行全体に一致するように、一致する数字の間にスペースを入れる必要があります。

詳細については、C++ tokenize a string using a regular expressionをご覧ください。

ここでは配列を使用しないでください。このコードを後で見なければならない人の安全、利便性、健全性のために標準のコンテナを使用してください。

"[0-9-\.]+" 

をもっとする必要があります:正規表現は、小さな問題を持っているよう

0

私が見えます

"[0-9\.]" 
0

、あなたは試してみてください、あなたの正規表現は正しくない可能性があります:

[0-9\.]+ 

また、std :: tr1 :: cmatchはマッチの配列を返すことを覚えておいてください。res[2]は、あなたが少しを試すことができますegrepを使用し72.7

が含まれています

egrep "[0-9-\.]+" /tmp/x 
egrep: Invalid range end 

しかし

egrep "^[0-9\.]+" /tmp/x 

試合のみ

129.3 

egrep "[0-9\.]+" /tmp/x 

試合すべて

129.3 72.7 121.6 173.6 203.3 120.7 40.5 79.2 94.0 123.2 165.8 178.8 135.5 78.5 66.2 

それは文字列の先頭にヌル文字に一致するため、あなたは世代、すなわち、数字の最初の列を前に^を必要としません。

それが最後でのみヌル文字にマッチするので、あなたは、このようにあなたがタイプ[0-9\.]の一致するすべての原子を取得したいので、あなたが+を必要とする数字

の唯一の最後のシーケンスを取得し、$を必要としません。

また、あなたが

man -S 7 regex 

P.S.をissueingことにより、任意のUNIXシステムでのショートガイド正規表現のマッチングを得ることができます/tmp/xは質問に記載されている行のファイルです。