不同的组,相同的模式-正则表达式cpp

时间:2018-07-03 16:51:14

标签: regex

这是我的正则表达式:

(^[A-Z]+\s*)(\s*\d+)\s*\[([A-Z]+\s*\d+\s*){1,}\]\s*

对于代码:

ABC 4[A 5 B 6 C 7]

现在正在生产:

Group 1: Full match
Group 2: ABC
Group 3: 4
Group 4: C 7

我希望它产生5组:

Group 1: Full match
Group 2: ABC
Group 3: 4
Group 4: A 5
Group 5: B 6
Group 6: C 7

我应该怎么做?

您可以在这里尝试:regex101

1 个答案:

答案 0 :(得分:1)

问题是您只有3个捕获组。最后一组匹配多次,但最后只能包含其中的一个(最后一个)。

我认为您需要进行两次比赛。第一个提取括号[<- stuff ->]的内容,第二个迭代其内容:

std::string s = "ABC 4[A 5 B 6 C 7]";

std::regex e_outer{R"((^[A-Z]+\s*)(\s*\d+)\s*\[([^\]]+)\]\s*)"};

std::smatch m;
if(std::regex_match(s, m, e_outer))
{
    std::cout << m[0] << '\n';
    std::cout << m[1] << '\n';
    std::cout << m[2] << '\n';

    std::string const inner = m[3]; // new match on this part

    std::regex e_inner{R"([A-Z]+\s*\d+\s*)"};

    std::sregex_iterator const end;
    std::sregex_iterator itr(std::begin(inner), std::end(inner), e_inner);

    for(; itr != end; ++itr)
        std::cout << itr->str() << '\n';
}

输出:

ABC 4[A 5 B 6 C 7]
ABC 
4
A 5 
B 6 
C 7