Namespaces
Variants

std:: regex_token_iterator

From es.cppreference.net
Regular expressions library
Classes
(C++11)
Algorithms
Iterators
regex_token_iterator
(C++11)
Exceptions
Traits
Constants
(C++11)
Regex Grammar
Definido en el 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 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]
  1. ↑ iterator_category no fue modificado por la resolución, porque cambiarlo a std::input_iterator_tag podría romper demasiado código existente.