c ++正则表达式匹配整行

时间:2012-02-17 22:50:36

标签: c++ regex

我正在尝试解析包含数字数据的文本文件。我有很多看起来像

的行
  

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-\.]+$"

只匹配最后一个号码。所以我可能做错了什么。谢谢你的帮助。

4 个答案:

答案 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是一个文件,其中包含问题中提供的行。