std:: regex_token_iterator
|
Definido en el encabezado
<regex>
|
||
|
template
<
class
BidirIt,
|
(desde C++11) | |
std::regex_token_iterator
es un
LegacyForwardIterator
de solo lectura que accede a las subcoincidencias individuales de cada coincidencia de una expresión regular dentro de la secuencia de caracteres subyacente. También puede utilizarse para acceder a las partes de la secuencia que no coincidieron con la expresión regular dada (por ejemplo, como un tokenizador).
Al construir, construye un std::regex_iterator y en cada incremento recorre las subcoincidencias solicitadas desde el match_results actual, incrementando el std::regex_iterator subyacente cuando se incrementa más allá de la última subcoincidencia.
El iterador construido por defecto
std::regex_token_iterator
es el iterador de fin de secuencia. Cuando un
std::regex_token_iterator
válido se incrementa después de alcanzar la última subcoincidencia de la última coincidencia, se vuelve igual al iterador de fin de secuencia. Desreferenciarlo o incrementarlo más allá invoca comportamiento indefinido.
Justo antes de convertirse en el iterador de fin de secuencia, un
std::regex_token_iterator
puede convertirse en un
suffix iterator
, si el índice
-
1
(fragmento no coincidente) aparece en la lista de los índices de subcoincidencia solicitados. Tal iterador, si se desreferencia, devuelve un match_results correspondiente a la secuencia de caracteres entre la última coincidencia y el fin de la secuencia.
Una implementación típica de
std::regex_token_iterator
mantiene el
std::regex_iterator
subyacente, un contenedor (por ejemplo
std::
vector
<
int
>
) de los índices de subcoincidencia solicitados, el contador interno igual al índice de la subcoincidencia, un puntero a
std::sub_match
, apuntando a la subcoincidencia actual de la coincidencia actual, y un objeto
std::match_results
que contiene la última secuencia de caracteres no coincidentes (utilizado en modo tokenizador).
Contenidos |
Requisitos de tipo
-
BidirIt
debe cumplir con los requisitos de
LegacyBidirectionalIterator
.
|
Especializaciones
Se definen varias especializaciones para tipos comunes de secuencias de caracteres:
|
Definido en el encabezado
<regex>
|
|
| Tipo | Definición |
std::cregex_token_iterator
|
std :: regex_token_iterator < const char * > |
std::wcregex_token_iterator
|
std :: regex_token_iterator < const wchar_t * > |
std::sregex_token_iterator
|
std :: regex_token_iterator < std:: string :: const_iterator > |
std::wsregex_token_iterator
|
std :: regex_token_iterator < std:: wstring :: const_iterator > |
Tipos de miembros
| Tipo de miembro | Definición |
value_type
|
std:: sub_match < BidirIt > |
difference_type
|
std::ptrdiff_t |
pointer
|
const value_type * |
reference
|
const value_type & |
iterator_category
|
std::forward_iterator_tag |
iterator_concept
(C++20)
|
std::input_iterator_tag |
regex_type
|
std:: basic_regex < CharT, Traits > |
Funciones miembro
construye un nuevo
regex_token_iterator
(función miembro pública) |
|
|
(destructor)
(declarado implícitamente)
|
destruye un
regex_token_iterator
, incluyendo el valor almacenado en caché
(función miembro pública) |
|
asigna contenidos
(función miembro pública) |
|
|
(eliminado en C++20)
|
compara dos
regex_token_iterator
s
(función miembro pública) |
|
accede a la subcoincidencia actual
(función miembro pública) |
|
|
avanza el iterador a la siguiente subcoincidencia
(función miembro pública) |
Notas
Es responsabilidad del programador asegurar que el objeto std::basic_regex pasado al constructor del iterador sobreviva al iterador. Debido a que el iterador almacena un std::regex_iterator que almacena un puntero al regex, incrementar el iterador después de que el regex haya sido destruido resulta en comportamiento indefinido.
Ejemplo
#include <algorithm> #include <fstream> #include <iostream> #include <iterator> #include <regex> int main() { // Tokenización (fragmentos no coincidentes) // Nótese que la expresión regular coincide solo dos veces; cuando se obtiene el tercer valor // el iterador es un iterador de sufijo. const std::string text = "Quick brown fox."; const std::regex ws_re("\\s+"); // espacio en blanco std::copy(std::sregex_token_iterator(text.begin(), text.end(), ws_re, -1), std::sregex_token_iterator(), std::ostream_iterator<std::string>(std::cout, "\n")); std::cout << '\n'; // Iterando las primeras subcoincidencias const std::string html = R"(<p><a href="http://google.com">google</a> )" R"(< a HREF ="http:https://es.cppreference.net">cppreference</a>\n</p>)"; const std::regex url_re(R"!!(<\s*A\s+[^>]*href\s*=\s*"([^"]*)")!!", std::regex::icase); std::copy(std::sregex_token_iterator(html.begin(), html.end(), url_re, 1), std::sregex_token_iterator(), std::ostream_iterator<std::string>(std::cout, "\n")); }
Salida:
Quick brown fox. http://google.com https://es.cppreference.net
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
|
LWG 3698
( P2770R0 ) |
C++20 |
regex_token_iterator
era un
forward_iterator
mientras era un iterador de almacenamiento |
convertido en
input_iterator
[1]
|
-
↑
iterator_categoryno fue modificado por la resolución, porque cambiarlo a std::input_iterator_tag podría romper demasiado código existente.