【发布时间】:2017-05-08 10:34:25
【问题描述】:
我正在尝试解析用点分隔的数字并将每个数字作为单独的字符串。那是我的示例程序:
#include <iostream>
#include <string>
#include <regex>
int main(int argc, char* argv[])
{
try
{
std::string data("123.321.456.654");
std::regex reg(R"(([0-9]+)\.(\1)\.(\1)\.(\1))");
std::smatch m;
if (std::regex_match(data, m, reg))
{
std::cout << m.size() << std::endl;
//std::cout << m[0].str() << std::endl;
std::cout << m[1].str() << std::endl;
std::cout << m[2].str() << std::endl;
std::cout << m[3].str() << std::endl;
std::cout << m[4].str() << std::endl;
}
}
catch (const std::exception& e)
{
std::cerr << "Error occurred: " << e.what() << std::endl;
}
return EXIT_SUCCESS;
}
在这个示例中,我使用了三个正则表达式:
作品:
std::regex reg(R"((\d+)\.(\d+)\.(\d+)\.(\d+))");
作品:
std::regex reg(R"(([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+))");
根本不工作:
std::regex reg(R"(([0-9]+)\.(\1)\.(\1)\.(\1))");
我的问题是为什么最后一个正则表达式不起作用,语法错误在哪里?谢谢。
【问题讨论】:
-
因为
\1是一个反向引用,所以它不是递归模式的子例程调用。它与第一个捕获组捕获的值匹配。 -
@WiktorStribiżew:答案在答案部分
-
这不是 C++ 问题,而是正则表达式问题;请养成将问题分解成各个部分的习惯。
-
@WiktorStribiżew 是的,所以第一组是
([0-9]+),这应该是正确的。 -
@SpaceRabbit:不,第一个反向引用是“123”。不是
[0-9]+。查看我的答案和我链接到的资源。