这是我的正则表达式:
(^[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
答案 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