std::regex_token_iterator
| Definido en el archivo de encabezado <regex>
|
||
template< class BidirIt, class CharT = typename std::iterator_traits<BidirIt>::value_type, class Traits = std::regex_traits<CharT> > class regex_token_iterator |
(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).
Requerimientos de tipo
-BidirIt debe satisfacer los requisitos de BidirectionalIterator.
|
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<const char*>
|
wcregex_token_iterator
|
regex_token_iterator<const wchar_t*>
|
sregex_token_iterator
|
regex_token_iterator<std::string::const_iterator>
|
wsregex_token_iterator
|
regex_token_iterator<std::wstring::const_iterator>
|
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>
|
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) |
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.
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.
const std::string texto = "La zorra veloz.";
const std::regex er_espacio("\\s+"); // espacio en blanco
std::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 subcoincidencias
const std::string html = R"(<p><a href="http://google.com.mx">google</a> )"
R"(< a HREF ="http://es.cppreference.com">cppreference</a>\n</p>)";
const std::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