我正在尝试解析包含数字数据的文本文件。我有很多看起来像
的行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 :(得分: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/
在这种情况下你会得到像
这样的东西Vector flts = // create it
for(int ix=0, char * cp; cp = strtok(str," "); ix++){
flts[ix] = atof(cp);
}
现在,这非常喜欢,因为我已经没有C ++的练习了,但关键是通过尝试使用正则表达式,你会使它过于复杂。
答案 1 :(得分:0)
您需要在匹配中包含数字之间的空格以匹配整行。
顺便说一句,看看C++ tokenize a string using a regular expression,看一个相当密切相关的答案。你真的不应该在这里使用数组,使用标准容器以保证以后必须查看此代码的任何人的安全,方便和理智。
答案 2 :(得分:0)
我看起来正则表达式有一个小问题:
"[0-9-\.]+"
应该更像:
"[0-9\.]"
答案 3 :(得分: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\.]
类型的所有匹配原子。
您还可以通过发出
在任何unix系统中获得简短的指南正则表达式匹配man -S 7 regex
P.S。 /tmp/x
是一个文件,其中包含问题中提供的行。