我想获取与此表达式匹配的所有子字符串:1[0]+1
std::string str = "0011011000001";
std::regex rx ("1[0]+1");
std::smatch res;
std::regex_search(str, res, rx);
for (size_t i=0; i<res.size(); i++)
std::cout<<res[i]<<std::endl;
但它只返回第一个子字符串。我究竟做错了什么?
您应该这样做以获取所有子字符串:
while (std::regex_search (str,res,rx)) {
std::cout <<res[0] << std::endl;
str = res.suffix().str();
}
或者您可以使用 std::regex_iterator 获取所有子字符串,如下所示:
std::regex_iterator<std::string::iterator> rit ( str.begin(), str.end(), rx);
std::regex_iterator<std::string::iterator> rend;
while (rit != rend) {
std::cout << rit->str() << std::endl;
++rit;
}
但是当字符串为“00110101000001”时,它仍然会输出“101”和“1000001”,因为第一个匹配会消耗部分字符串。如果你想找到所有重叠的匹配,那么你需要一个支持Lookaround Assertion的正则表达式实现。Python 会:
>>> re.findall(r'(?=(1[0]+1))', '00110101000001')
['101', '101', '1000001']
(?=...) 匹配 if ... 匹配下一个,但不消耗任何字符串。这称为前瞻断言。例如,Isaac (?=Asimov) 仅在其后跟 'Asimov' 时才会匹配 'Isaac'。
使匹配不贪心...
std::regex rx ("(1[0]+1)?");