c ++ 11 regexp使用+ / *修饰符检索所有组

时间:2017-09-18 19:48:15

标签: regex c++11

我不明白如何在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

我遗失了23

1 个答案:

答案 0 :(得分:1)

您无法使用当前方法,因为std::regex不允许将捕获的值存储在内存中,每次捕获字符串的一部分时,组中的前一个值将使用new重写一,找到并返回匹配后,只有最后捕获的值可用。由于您在模式中定义了3个捕获组,因此输出中有3 + 1个组。 还要注意,std::regex_search只返回一个匹配,而这里需要多个匹配。

所以,你可以做的是执行两个步骤:1)使用你拥有的模式验证字符串(这里不需要捕获),2)提取数字(或用逗号分隔,这取决于要求)。

A C++ demo

#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