试图理解基本的正则表达式函数在c++

Trying to understand basic regex functions in C++

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

我已经在Perl中使用正则表达式很多年了,现在正尝试在c++中使用它们。不过遇到了一些问题。我想解析一个字符串,如translate(0.0,-572.36218),并获取2个数值。

到目前为止我写的是:

std::cmatch m;
std::regex e("([-|.|0-9]*),([-|.|0-9]*)" );  
std::regex_search ("translate(0.0,-572.36218)",m,e);
float xTransform = atof(m[1].first);
float yTransform = atof(m[2].first);

然而,当我在调试器中查看这些值时,我看到的是:

m[0].first = "0.0,-572.36218)"
m[1].first = "0.0,-572.36218)"
m[3].first = "-572.36218)";

如果我使用正则表达式调试工具(如正则表达式教练),我可以看到我的正则表达式在语法上是正确的。我想我只是不知道我这样做是否正确,或者如何从cmatch实例中提取我需要的数据。

更新:我一定错过了什么,因为如果我把正则表达式改成这样:

std::regex e("([0-9])");

m返回只有2个条目深度,并且每个条目的第一个元素= "0.0,-572.36218)"。为什么这个匹配括号,我不明白。而[0-9]似乎没有效果……它匹配每个字符。非常fristrating。(

你应该用\.。当您使用.时,它匹配整个字符串—因为.被C转义为简单的.。后来,.[-|.|0-9]*中乘以*以匹配任何内容

其他人已经指出需要在RE中转义反斜杠。c++ 11提供了另一种选择:原始字符串字面量。例如:

std::regex e(R"(([-|.|0-9]*),([-|.|0-9]*))");

请注意,这里的开始分隔符是"(,结束分隔符是)",所以我在字符串中添加了一个额外的"("answers")"。

的大量使用使得原始字符串在定义res时特别方便。