c++正则表达式匹配整行
c++ regular expression matching whole line
我正在尝试解析一个包含数字数据的文本文件。我有很多行看起来像
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
是一个带有问题中提供的行的文件。
- 使用正则表达式regex_search在字符串中查找字符串
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- C++正则表达式无限循环
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- 定义有趣的宏和正则表达式在Z3 C++绑定
- 带有多个字符分隔符的正则表达式
- C++ 使用增强正则表达式库时断言崩溃
- 有人可以帮助我处理正则表达式吗?
- 使用正则表达式获取大括号块的列表
- 正则表达式以匹配数字的重复模式,后跟任何类型的分隔符?
- 组合正则表达式部分使用 | 不起作用的 C++
- 为什么C++正则表达式这么慢?
- 如何使HTML5电子邮件验证正则表达式在C++中工作?
- 在C++中实现正则表达式
- C++正则表达式替换整个单词
- 用C++编写正则表达式的正确方法是什么?
- 如何从Stroustrup的C++书中解释这个正则表达式?
- 为什么这个正则表达式C++在括号表达式中抛出无效范围异常?
- C++:匹配正则表达式,什么是匹配?
- C++:正则表达式匹配代码,打印多个匹配项?