Группы

Если необходимо получить содержимое без тегов, то нужный фрагмент внутри шаблона следует разместить внутри круглых скобок:

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(0) << std::endl;
   std::cout << istart->str(1) << std::endl;
   ++istart;
}

Результат:

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

Обратите внимание на то, что мы указали индексы в методе str(). Если индекс не указан или равняется 0, то получим строку, полностью соответствующую шаблону. Индекс больше 0 указывает на порядковый номер круглых скобок внутри шаблона. Указав индекс 1, мы получили фрагмент, соответствующий (.*?), т. е. текст внутри тегов <b>. Можно также указать индекс внутри квадратных скобок:

std::smatch m = *istart;
std::cout << m[0] << std::endl;
std::cout << m[1] << std::endl;

Круглые скобки часто используются для группировки фрагментов внутри шаблона. В этих случаях не требуется, чтобы фрагмент запоминался и был доступен в результатах поиска. Пример:

std::regex rgx("([a-z]+((st)|(xt)))");
std::string str("test text");
std::sregex_iterator istart(str.begin(), str.end(), rgx);
std::sregex_iterator iend;
std::smatch m;
while (istart != iend) {
   m = *istart;
   for (size_t i = 1, size = m.size(); i < size; ++i) {
      std::cout << m.str(i) << '_';
   }
   std::cout << std::endl;
   ++istart;
}

Результат:

test_st_st__
text_xt__xt_

В этом примере мы получили список из четырех элементов для каждого совпадения. Все эти элементы соответствуют фрагментам, заключенным в шаблоне в круглые скобки. Первый элемент содержит фрагмент, расположенный в первых круглых скобках, второй — во вторых круглых скобках и т. д. Три последних элемента являются лишними. Чтобы избежать захвата фрагмента, после открывающей круглой скобки следует разместить символы ?:. Пример:

std::regex rgx("([a-z]+(?:(?:st)|(?:xt)))");
std::string str("test text");
std::sregex_iterator istart(str.begin(), str.end(), rgx);
std::sregex_iterator iend;
std::smatch m;
while (istart != iend) {
   m = *istart;
   for (size_t i = 1, size = m.size(); i < size; ++i) {
      std::cout << m.str(i) << ' ';
   }
   std::cout << std::endl;
   ++istart;
}

В результате список состоит только из фрагментов, полностью соответствующих регулярному выражению:

test 
text 

Обратите внимание на регулярное выражение в предыдущем примере:

"([a-z]+((st)|(xt)))"

Здесь мы использовали метасимвол |, который позволяет сделать выбор между альтернативными значениями. Выражение n|m соответствует одному из символов n или m. Пример: красн((ая)|(ое)) — красная или красное, но не красный

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

Помощь сайту

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

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