0

多年来,我已经在 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] 似乎没有效果..它只匹配每个字符。非常令人毛骨悚然。:(

4

2 回答 2

2

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

于 2013-04-18T04:28:17.040 回答
1

其他人已经指出需要避开 RE 中的反斜杠。C++11 提供了一种替代方案:原始字符串文字。例如:

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

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

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

于 2013-04-18T04:38:32.883 回答