试图理解C ++中的基本正则表达式函数

时间:2013-04-18 04:19:39

标签: c++ regex expression

我已经在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)";

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

更新: 我必须真的丢失一些东西,因为如果我将正则表达式改为这样:

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

m返回只有2个条目深,每个条目的第一个元素=“0.0,-572.36218”“。为什么这与括号匹配超出了我的范围。并且[0-9]似乎没有效果..它只匹配每个角色。非常冷酷。 :(

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

其他人已经指出需要逃避RE中的反斜杠。 C ++ 11提供了另一种选择:原始字符串文字。例如:

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

请注意,此处的开头分隔符为"(,结束分隔符为)",因此我在您的字符串中添加了额外的“(”和“)”。

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