std::regex_token_iterator
Definido en el archivo de encabezado <regex> | ||
template< class BidirIt, | (desde C++11) | |
std::regex_token_iterator
es un ForwardIterator de solo lectura que accede a las subcoincidencias individuales de cada coincidencia de una expresión regular dentro de la secuencia de caracteres subyacentes. También se puede usar para acceder a las partes de la secuencia que no se coincidieron por una expresión regular dada (p. ej., como un tokenizador).
Durante la construcción, construye un std::regex_iterator y en cada incremento pasa a través de las subcoincidencias solicitadas del objeto std::match_results actual, incrementando el regex_iterator
subyacente cuando la incrementación se aleja de la última subcoincidencia.
El iterador std::regex_token_iterator
construido por defecto es el iterador al final de la secuencia. Cuando un iterador std::regex_token_iterator
válido se incrementa después de alcanzar la última subcoincidencia de la última coincidencia, se hace igual al iterador al final de la secuencia. Desreferenciarlo o incrementarlo más allá resulta en comportamiento no definido.
Justo antes de volverse el iterador al final de la secuencia, un std::regex_token_iterator
puede volverse un iterador de sufijo, si el índice -1 (un fragmento no coincidido) aparece en la lista de los índices de la subcoincidencia solicitada. Dicho iterador, si se desreferencia, devuelve un objeto std::match_results correspondiente a la secuencia de caracteres entre la última coincidencia y el final de la secuencia.
Una implementación habitual de std::regex_token_iterator
alberga el iterador std::regex_iterator subyacente, un contenedor (p. ej., std::vector<int>) de los índices de la subcoincidencia solicitada, el contador interno igual al índice de la subcoincidencia, un puntero a std::sub_match, que apunta a la subcoincidencia actual de la coincidencia actual, y un objeto std::match_results que contiene la última secuencia de caracteres que no coincidieron (usados en la modalidad tokenizador).
Contenido |
[editar]Requerimientos de tipo
-BidirIt debe satisfacer los requisitos de BidirectionalIterator. |
[editar]Especializaciones
Se definen varias especializaciones para los tipos de secuencias de caracteres comunes:
Definido en el archivo de encabezado <regex> | |
Tipo | Definición |
cregex_token_iterator | regex_token_iterator<constchar*> |
wcregex_token_iterator | regex_token_iterator<constwchar_t*> |
sregex_token_iterator | regex_token_iterator<std::string::const_iterator> |
wsregex_token_iterator | regex_token_iterator<std::wstring::const_iterator> |
[editar]Tipos miembro
Tipo 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 |
regex_type | basic_regex<CharT, Traits> |
[editar]Funciones miembro
Construye un nuevo objeto regex_token_iterator . (función miembro pública) | |
(destructor) (implícitamente declarado) | Destruye un objeto regex_token_iterator , incluyendo el valor almacenado en caché. (función miembro pública) |
Asigna el contenido. (función miembro pública) | |
(eliminado en C++20) | Compara dos objetos regex_token_iterator . (función miembro pública) |
Accede a la subcoincidencia actual. (función miembro pública) | |
Avanza el iterador a la subcoincidencia siguiente. (función miembro pública) |
[editar]Notas
La responsabilidad del programador es 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 a la expresión regular, incrementar el iterador después de que se destruyó la expresión regular resulta en comportamiento no definido.
[editar]Ejemplo
#include <fstream>#include <iostream>#include <algorithm>#include <iterator>#include <regex> int main(){// Tokenización (fragmentos que no coincidieron)// Observa que la expresión regular se coincide solo dos veces;// cuando el tercer valor se obtiene, el iterador es un iterador de sufijo.conststd::string texto ="La zorra veloz.";conststd::regex er_espacio("\\s+");// espacio en blancostd::copy( std::sregex_token_iterator(texto.begin(), texto.end(), er_espacio, -1), std::sregex_token_iterator(), std::ostream_iterator<std::string>(std::cout, "\n")); std::cout<<'\n'; // Iterar sobre las primeras subcoincidenciasconststd::string html = R"(<p><a href="http://google.com.mx">google</a> )" R"(< a HREF ="http://es.cppreference.com">cppreference</a>\n</p>)";conststd::regex er_url(R"!!(<\s*A\s+[^>]*href\s*=\s*"([^"]*)")!!", std::regex::icase); std::copy( std::sregex_token_iterator(html.begin(), html.end(), er_url, 1), std::sregex_token_iterator(), std::ostream_iterator<std::string>(std::cout, "\n")); }
Salida:
La zorra veloz. http://google.com.mx http://es.cppreference.com