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

c++ regular expression matching whole line

本文关键字:正则表达式 c++      更新时间:2023-10-16

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

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

刚好匹配最后一个数字。所以我可能做错了什么。谢谢你的帮助。

Um,伪代码

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

这里有一个使用大量流魔术的例子:在C++中拆分字符串?

下面是一个使用矢量的示例:在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,因为我对C++已经不熟悉了,但这里的关键是,通过尝试使用regex,你会使它过于复杂。

您需要在匹配中包含数字之间的空格,以匹配整行。

顺便说一句,看看C++使用正则表达式标记一个字符串,可以看到一个非常密切相关的答案。

你真的不应该在这里使用数组,使用标准容器是为了安全、方便和理智,让以后必须查看此代码的人都能使用。

我觉得正则表达式有一个小问题:

"[0-9-.]+"

应该更像:

 "[0-9.]"

您的正则表达式可能不正确,您应该尝试:

[0-9.]+

还要记住,std::tr1::cmatch返回匹配的数组,即res[2]包含72.7

使用egrp可以进行一些实验:

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

前面不需要^,因为它与字符串开头的空字符匹配,即只生成第一个数字序列。

你不需要$,因为它只匹配末尾的空字符,因此你只得到最后一个数字序列

你需要CCD_ 5,因为你想得到所有类型为CCD_。

此外,您还可以通过发出在任何unix系统中获得一个简短的正则表达式匹配指南

man -S 7 regex

p.s./tmp/x是一个带有问题中提供的行的文件。