В чем разница между regex_token_iterator и regex_iterator?

Есть ли разница между regex_token_iterator и regex_iterator?

Кажется, они оба выполняют ту же работу, но не уверены, какая из них лучше?

Ответ 1

Есть действительно разница между ними, если мы посмотрим на cppreference, он описывает std:: regex_iterator следующим образом:

std:: regex_iterator - это ForwardIterator только для чтения, который обращается к отдельным совпадениям регулярного выражения в пределах последовательности символов.

и std:: regex_token_iterator как:

std:: regex_token_iterator - это ForwardIterator только для чтения, который обращается к отдельным подмассам каждого соответствия регулярного выражения в базовой последовательности символов. Его также можно использовать для доступа к частям последовательности, которые не соответствовали данному регулярному выражению (например, как токенизатор).

Итак, std::regex_token_iterator позволяет вам также сопоставлять несогласованные токены или подвыражение n-th.

Раздел cppreference для std::regex_token_iterator, который я связал выше, описывает типичную реализацию следующим образом:

Типичная реализация std:: regex_token_iterator содержит базовый std:: regex_iterator, контейнер (например, std::vector) запрошенные индексы отправки, внутренний счетчик, равный индекс подгрузки, указатель на std:: sub_match, указывающий на текущая подача текущего совпадения и объект std:: match_results содержащий последнюю несогласованную последовательность символов (используется в токенизаторе режим).

В книге Стандартная библиотека С++ объясняется в 14.4 Итераторах токенов Regex следующим образом:

Итератор регулярных выражений помогает перебирать согласованные подпоследовательности. Однако, иногда вы также хотите обработать все содержимое между совпадающими выражения. [...] Кроме того, вы можете указать список интегральных значения, которые представляют собой элементы "токенизации":

  • -1 означает, что вас интересуют все подпоследовательности между согласованными регулярными выражениями (разделители токенов).
  • 0 означает, что вас интересуют все согласованные регулярные выражения (разделители токенов).
  • Любое другое значение n означает, что вас интересует согласованное n-е подвыражение внутри регулярных выражений.

На сайте books приведен пример кода sregex_token_iterator и sregex_iterator который также должен быть полезен.