如何解决使用正则表达式从std :: string提取数据
类似于Parse comma-separated ints/int-ranges in C++,
我希望正则表达式从字符串中提取边缘:(1,2,1) (2,4,5) (1,3) (3,10) (3,6,2) (3,5,3) (6,7,6) (4,4)
其中(Node1 number,Node2 number,distance)
。
我当前正在使用:std::regex reg_edge("\(.*?\,.*?\,.*?\)");
,该命令不起作用(因为找不到单个匹配项)。
由于这也可能是XY问题,所以我将陈述我想做的事情:我希望用户在创建图形时输入图形的边缘。
请提出正确的正则表达式,或者完全建议使用更好的方法。
我当前的代码:
void Graph::setEdges() {
std::string edge_str;
std::getline(std::cin,edge_str);
std::istringstream iss(edge_str);
edge_str.clear();
while (iss >> edge_str) {
std::regex reg_edge("\(.*?\,\)");
auto reg_begin = std::sregex_iterator(edge_str.begin(),edge_str.end(),reg_edge);
auto reg_end = std::sregex_iterator();
for (std::sregex_iterator reg_it = reg_begin; reg_it != reg_end; reg_it++) {
std::smatch it_match = *reg_it;
}
}
}
解决方法
您可以将正则表达式\((\d+),(\d+),(\d+)\)
与std::sregex_iterator
一起使用。请注意,您必须转义(
和)
才能从字面上进行匹配。同样,使用原始文字字符串可以使正则表达式更容易。
然后使用operator[]
提取每个匹配的组。组0始终是整个组,因此您需要使用组1、2和3。
std::regex reg(R"(\((\d+),(\d+)\))");
std::string str = "(1,2,1) (2,4,5) (1,3) (3,10) (3,6,2) (3,5,3) (6,7,6) (4,4)";
auto start = std::sregex_iterator(str.begin(),str.end(),reg);
auto end = std::sregex_iterator{};
for (std::sregex_iterator it = start; it != end; ++it)
{
std::cout << "Node1 = " << (*it)[1] << ",Node2 = " << (*it)[2]
<< ",Distance = " << (*it)[3] << std::endl;
}
这里是demo。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。