Namespaces
Variants

std:: regex_token_iterator

From cppreference.net
Regular expressions library
Classes
(C++11)
Algorithms
Iterators
regex_token_iterator
(C++11)
Exceptions
Traits
Constants
(C++11)
Regex Grammar
헤더 파일에 정의됨 <regex>
template <

class BidirIt,
class CharT = typename std:: iterator_traits < BidirIt > :: value_type ,
class Traits = std:: regex_traits < CharT >

> class regex_token_iterator
(C++11부터)

std::regex_token_iterator 는 기본 문자 시퀀스 내에서 정규 표현식의 모든 매치에 대한 개별 서브 매치에 접근하는 읽기 전용 LegacyForwardIterator 입니다. 또한 주어진 정규 표현식으로 매치되지 않은 시퀀스의 부분에 접근하는 데에도 사용될 수 있습니다 (예: 토크나이저로서).

생성 시, 이는 std::regex_iterator 를 구성하며, 모든 증가 연산에서 현재 match_results에서 요청된 하위 매치들을 순회하며, 마지막 하위 매치에서 벗어날 때 기본 std::regex_iterator 를 증가시킵니다.

기본 생성된 std::regex_token_iterator 는 시퀀스 종료 반복자입니다. 유효한 std::regex_token_iterator 가 마지막 매치의 마지막 부분 매치에 도달한 후 증가되면, 이는 시퀀스 종료 반복자와 동일해집니다. 이를 역참조하거나 추가로 증가시키는 것은 정의되지 않은 동작을 유발합니다.

시퀀스의 끝 반복자가 되기 직전에, std::regex_token_iterator suffix iterator 가 될 수 있습니다. 이는 인덱스 - 1 (비일치 조각)이 요청된 부분 일치 인덱스 목록에 포함된 경우입니다. 이러한 반복자를 역참조하면, 마지막 일치와 시퀀스의 끝 사이에 있는 문자 시퀀스에 해당하는 match_results를 반환합니다.

std::regex_token_iterator 의 일반적인 구현은 기본 std::regex_iterator , 요청된 부분 매치 인덱스들의 컨테이너(예: std:: vector < int > ), 부분 매치 인덱스와 동일한 내부 카운터, 현재 매치의 현재 부분 매치를 가리키는 std::sub_match 에 대한 포인터, 그리고 마지막으로 매치되지 않은 문자 시퀀스를 포함하는 std::match_results 객체(토크나이저 모드에서 사용됨)를 보유합니다.

목차

타입 요구사항

-
BidirIt LegacyBidirectionalIterator 의 요구사항을 충족해야 합니다.

특수화

일반적인 문자 시퀀스 타입에 대한 여러 특수화가 정의되어 있습니다:

헤더 파일에 정의됨 <regex>
타입 정의
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 >

멤버 타입

멤버 타입 정의
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 >

멤버 함수

새로운 regex_token_iterator 를 생성함
(public member function)
(destructor)
(implicitly declared)
캐시된 값을 포함한 regex_token_iterator 를 소멸시킴
(public member function)
내용을 할당함
(public member function)
(removed in C++20)
두 개의 regex_token_iterator 를 비교함
(public member function)
현재 서브매치에 접근함
(public member function)
반복자를 다음 서브매치로 전진시킴
(public member function)

참고 사항

프로그래머는 반복자의 생성자에 전달된 std::basic_regex 객체가 반복자보다 오래 유지되도록 할 책임이 있습니다. 반복자가 정규 표현식에 대한 포인터를 저장하는 std::regex_iterator 를 저장하기 때문에, 정규 표현식이 소멸된 후 반복자를 증가시키는 것은 정의되지 않은 동작을 초래합니다.

예제

#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <regex>
int main()
{
    // 토큰화 (비매칭 조각들)
    // 정규식은 두 번만 매칭됨; 세 번째 값을 얻을 때
    // 반복자는 접미사 반복자임
    const std::string text = "Quick brown fox.";
    const std::regex ws_re("\\s+"); // 공백
    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';
    // 첫 번째 부분 매칭 반복
    const std::string html = R"(<p><a href="http://google.com">google</a> )"
                             R"(< a HREF ="http://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"));
}

출력:

Quick
brown
fox.
http://google.com
http://cppreference.net

결함 보고서

다음 동작 변경 결함 보고서는 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 3698
( P2770R0 )
C++20 regex_token_iterator 가 스태싱 반복자임에도 forward_iterator 였음 input_iterator [1] 로 변경됨
  1. iterator_category 는 해결안에 의해 변경되지 않았습니다. 왜냐하면 이를 std::input_iterator_tag 로 변경하면 기존 코드가 너무 많이 손상될 수 있기 때문입니다.