std:: regex_token_iterator
|
헤더 파일에 정의됨
<regex>
|
||
|
template
<
class
BidirIt,
|
(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]
로 변경됨
|
-
↑
iterator_category는 해결안에 의해 변경되지 않았습니다. 왜냐하면 이를 std::input_iterator_tag 로 변경하면 기존 코드가 너무 많이 손상될 수 있기 때문입니다.