2012-02-17 108 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是一个包含问题中提供的行的文件。