// Example program
#include <iostream>
#include <string>
#include <regex>
int main()
{
std::string strr("1.0.0.0029.443");
std::regex rgx("([0-9])");
std::smatch match;
if (std::regex_search(strr, match, rgx)) {
for(int i=0;i<match.size();i++)
std::cout << match[i] << std::endl;
}
}
这个程序应该写
1
0
0
0
0
2
9
4
4
3
但它写了
1
1
在这里http://cpp.sh/和视觉工作室检查了两个相同的结果。
为什么它只找到2个匹配,为什么它们相同?
正如我从这里的答案中理解的那样,正则表达式搜索在第一次匹配时停止并且匹配变量保持必要的(子?)字符串值以继续(通过重复)其他匹配。此外,由于它在第一场比赛时停止,()
字符仅用于结果中的子匹配。
答案 0 :(得分:4)
被叫一次,regex_search
只返回match
变量中的第一个匹配项。 match
中的集合包含匹配本身和捕获组(如果有)。
为了让所有匹配在循环中调用regex_search
:
while(regex_search(strr, match, rgx))
{
std::cout << match[0] << std::endl;
strr = match.suffix();
}
请注意,在您的情况下,第一个捕获组与整个匹配相同,因此组中不需要,您可以将正则表达式简单地定义为[0-9]
(不带括号)。
答案 1 :(得分:1)
问题:
if
只能为您提供一个匹配项。您需要使用while
循环来查找所有匹配项。您需要在循环的下一次迭代中搜索上一个匹配项。std::smatch::size()
返回1 +匹配数。见its documentation。 std::smatch
可以包含子匹配。要获取整个文本,请使用match[0]
。这是您的计划的更新版本:
#include <iostream>
#include <string>
#include <regex>
int main()
{
std::string strr("1.0.0.0029.443");
std::regex rgx("([0-9])");
std::smatch match;
while (std::regex_search(strr, match, rgx)) {
std::cout << match[0] << std::endl;
strr = match.suffix();
}
}