2012-02-17 159 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] ...應該有你的匹配。你有沒有檢查過,或者你剛剛獲得資源? – 2012-02-17 23:08:55

+0

regexp實際上並不是這裏最好的解決方案,只需使用運算符>>進入浮點數就容易多了,而且更適合。 – PlasmaHH 2012-02-17 23:19:30

+0

我同意PlasmaHH,但誰知道什麼原因,有人想玩正則表達式... – 2012-02-17 23:22:38

回答

2

嗯,僞

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

下面是使用大量的數據流的魔力,例如:Split a string in C++?

下面是一個使用向量的例子: Splitting a string by whitespace in c++

但老式的strtok可能是最簡單的: http://www.cplusplus.com/reference/clibrary/cstring/strtok/

其中CAS Ë你就會得到這樣

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

現在,這是非常ç喜歡,因爲我出實踐C++的,但這裏的關鍵點是,通過嘗試使用正則表達式,你把它過於複雜。

+0

同意,strtok是最好的! – macduff 2012-02-17 22:57:35

+0

確實......當你想要選擇符合標準和線程安全的標準時,strtok會獲勝! – jkerian 2012-02-17 23:01:04

+0

這不是C++,而是c。 – 2012-02-17 23:21:35

0

你需要在你的對手的整條生產線相匹配的數字之間的空間。

BTW,看看C++ tokenize a string using a regular expression看到一個相當密切相關的答案。

你真的不應該在這裏使用數組,使用安全,方便,誰擁有這個代碼後看的理智的標準集裝箱。

0

我看起來像正則表達式有一個小問題:

"[0-9-\.]+" 

應該更像:

"[0-9\.]" 
0

您正則表達式可能是不正確的,你應該嘗試:

[0-9\.]+ 

還要記住,std :: tr1 :: cmatch返回一個匹配數組,即res[2]包含72.7

使用egrep的,你可以嘗試一下:

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\.]類型的所有匹配的原子。

您也可以通過issueing

man -S 7 regex 

附註:獲得任何UNIX系統的簡短說明正則表達式匹配/tmp/x是一個包含問題中提供的行的文件。