Есть ли разница между regex_token_iterator и regex_iterator?
Кажется, они оба выполняют ту же работу, но не уверены, какая из них лучше?
Есть ли разница между regex_token_iterator и regex_iterator?
Кажется, они оба выполняют ту же работу, но не уверены, какая из них лучше?
Есть действительно разница между ними, если мы посмотрим на 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 который также должен быть полезен.