使用c++正则表达式验证ASCII GnuPlot文件
Validate ASCII GnuPlot file with c++ regex
我一直在努力做到这一点,但似乎无法使事情按我希望的方式进行。
我有一个ASCII文件,其中包含数百万行浮点值,用空格分隔。使用std::istream_iterator<double>
读取这些值很简单,但我想预先验证文件,以确保它确实按照我描述的方式进行了格式化。由于只有一种正确的格式,以及如何对其进行错误格式化的方法,我想使用std::regex
进行处理。
这就是我想到的:
std::string begln( "^" );
std::string endln( "$" );
std::string fp( "[-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)?." );
std::string space( "[[:space:]]{1}" );
std::regex regexp( "(" + begln + fp + space + fp + space + fp + endln + ")+" );
我想表达的是:一条线由线的开始和结束之间的东西组成,它由三组用一个空格分隔的浮点值组成,我正在寻找其中的一条或多条线。
我希望一个有效的数据文件只有一个匹配项,没有前缀和后缀。
但是,嘿,既然这些值将进入std::vector<std::array<double, 3>>
,为什么我不重用regex机制并从匹配列表中获取值呢?如果文件是有效的,那么一个绝对平凡的regex可以只匹配单个行,并构造一个std::sregex_iterator
来迭代这些行。在这一点上,无论是再次使用regex还是std::stringsteam
,如何从一行的单个std::string
中获得值只是一个问题。
为什么不呢?您之所以不希望这样做,是因为regex绝对是过度使用。它们可以匹配更复杂的语法,并且能够在运行时阅读这些语法。这种灵活性付出了高昂的代价。必须包括所有可能的解析器。当前没有一个编译器足够聪明,可以看到您只是将[[:space:]]
用作正则表达式。(事实上,没有一个C++编译器或链接器知道regex——这纯粹是一个库的东西)。
相比之下,operator>>
是重载的,编译器可以准确地看到您在编译时使用的重载。链接器被告知这一点,并且仅包括相关代码。
此外,CPU分支预测器将很快注意到operator>>
几乎总是成功,这是进一步的加速。您的正则表达式代码不太可能以同样的方式受益——[0-9]*
中的条件部分至少有一层间接更深。
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何在 Gnuplot 中分别绘制 2 个文件数据?我有一个文件"sin.txt",另一个文件"cos.txt",我想将它们分别绘制在一个图表上
- 使用c++正则表达式验证ASCII GnuPlot文件
- 使用gnuplot动态绘制易失性数据文件
- 连接C ++文件和Gnuplot并在执行后自动绘图
- Gnuplot C++从txt文件实时绘图
- 使用system()与Gnuplot进行绘图会导致错误:文件不可读
- 用c++和gnuplot写入文本文件并绘图
- 更新gnuplot数据集,不需要c++中的文件
- GNUPlot: 警告: 跳过没有有效点的数据文件
- 如何使用 gnuplot-iostream.h 读取C++中的数据文件
- 如何使用 c++ (Xcode) 从 csv 文本文件中绘制 gnuplot
- 在RAM中创建临时文件,并在Gnuplot中使用它
- Gnuplot:跳过最后一行/不完整的数据文件