我不明白如何在c ++中使用regexp检索所有组 一个例子:
const std::string s = "1,2,3,5";
std::regex lrx("^(\\d+)(,(\\d+))*$");
std::smatch match;
if (std::regex_search(s, match, lrx))
{
int i = 0;
for (auto m : match)
std::cout << " submatch " << i++ << ": "<< m << std::endl;
}
给我结果
submatch 0: 1,2,3,5
submatch 1: 1
submatch 2: ,5
submatch 3: 5
我遗失了2
和3
答案 0 :(得分:1)
您无法使用当前方法,因为std::regex
不允许将捕获的值存储在内存中,每次捕获字符串的一部分时,组中的前一个值将使用new重写一,找到并返回匹配后,只有最后捕获的值可用。由于您在模式中定义了3个捕获组,因此输出中有3 + 1个组。
还要注意,std::regex_search
只返回一个匹配,而这里需要多个匹配。
所以,你可以做的是执行两个步骤:1)使用你拥有的模式验证字符串(这里不需要捕获),2)提取数字(或用逗号分隔,这取决于要求)。
#include <string>
#include <iostream>
#include <regex>
using namespace std;
int main() {
std::regex rx_extract("[0-9]+");
std::regex rx_validate(R"(^\d+(?:,\d+)*$)");
std::string s = "1,2,3,5";
if (regex_match(s, rx_validate)) {
for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), rx_extract);
i != std::sregex_iterator();
++i)
{
std::smatch m = *i;
std::cout << m.str() << '\n';
}
}
return 0;
}
输出:
1
2
3
5