Решение
@ stribizhev имеет квадратичную сложность худшего случая для правильных регулярных выражений. Для безумных (например, «y *») он не заканчивается. В некоторых приложениях эти проблемы могут быть вызваны DoS-атаками . Вот фиксированная версия:
string str("abcdefabcghiabc");
int i = 0;
regex rgx1("abc");
smatch smtch;
auto beg = str.cbegin();
while (regex_search(beg, str.cend(), smtch, rgx1)) {
std::cout << i << ": " << smtch[0] << std::endl;
i += 1;
if ( smtch.length(0) > 0 )
std::advance(beg, smtch.length(0));
else if ( beg != str.cend() )
++beg;
else
break;
}
Согласно моим личным предпочтениям, это найдет n + 1 совпадений пустого регулярного выражения в строке длины n. Вы также можете просто выйти из цикла после пустого совпадения.
Если вы хотите сравнить производительность для строки с миллионами совпадений, добавьте следующие строки после определения str
(и не забудьте включить оптимизацию), один раз для каждой версии:
for (int j = 0; j < 20; ++j)
str = str + str;