すべての部分文字列を取得するには、これを行う必要があります。
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']
(?=...) ... が次に一致する場合に一致しますが、文字列を消費しません。これは、先読みアサーションと呼ばれます。たとえば、Isaac (?=Asimov) は、後に「Asimov」が続く場合にのみ「Isaac」と一致します。