Жадность квантификаторов

Все квантификаторы являются «жадными». При поиске соответствия ищется самая длинная подстрока, соответствующая шаблону, и не учитываются более короткие соответствия. Рассмотрим это на примере. Получим содержимое всех тегов <b>, вместе с тегами:

std::regex rgx("<b>.*</b>");
std::string str("<b>Text1</b>Text2<b>Text3</b>");
std::sregex_iterator istart(str.begin(), str.end(), rgx);
std::sregex_iterator iend;
while (istart != iend) {
   std::cout << istart->str() << std::endl;
   ++istart;
} // <b>Text1</b>Text2<b>Text3</b>

Вместо желаемого результата мы получили полностью строку. Чтобы ограничить «жадность» квантификатора необходимо после него указать символ ?:

std::regex rgx("<b>.*?</b>");
std::string str("<b>Text1</b>Text2<b>Text3</b>");
std::sregex_iterator istart(str.begin(), str.end(), rgx);
std::sregex_iterator iend;
while (istart != iend) {
   std::cout << istart->str() << std::endl;
   ++istart;
}

Этот код выведет то, что мы искали:

<b>Text1</b>
<b>Text3</b>

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов