std:: regex_iterator
|
헤더 파일에 정의됨
<regex>
|
||
|
template
<
class
BidirIt,
|
(C++11 이후) | |
std::regex_iterator
는 기본 문자 시퀀스 내에서 정규 표현식의 개별 일치 항목에 접근하는 읽기 전용 반복자입니다. 이는
LegacyForwardIterator
요구 사항을 충족하지만, 역참조 가능한 값
a
와
b
가
a
==
b
를 만족할 때,
*
a
와
*
b
가 동일한 객체에 바인딩되지 않는다는 점이 예외입니다.
생성 시와 모든 증가 연산 시에 std::regex_search 을 호출하고 결과를 저장합니다(즉, std:: match_results < BidirIt > 값의 복사본을 저장). 첫 번째 객체는 반복자가 생성될 때나 첫 번째 역참조가 수행될 때 읽힐 수 있습니다. 그 외의 경우, 역참조는 가장 최근에 얻은 정규식 일치의 복사본만 반환합니다.
기본 생성된
std::regex_iterator
는 시퀀스 종료 반복자입니다. 유효한
std::regex_iterator
가 마지막 매치에 도달한 후 증가되면(
std::regex_search
가
false
를 반환함), 이는 시퀀스 종료 반복자와 동일해집니다. 이를 역참조하거나 추가로 증가시키는 것은 정의되지 않은 동작을 유발합니다.
std::regex_iterator
의 일반적인 구현은 기본 시퀀스에 대한 시작 및 끝 반복자(
BidirIt
의 두 인스턴스), 정규 표현식에 대한 포인터(
const
regex_type
*
), 매치 플래그(
std::regex_constants::match_flag_type
), 그리고 현재 매치(
std::
match_results
<
BidirIt
>
)를 보유합니다.
목차 |
타입 요구사항
-
BidirIt
는
LegacyBidirectionalIterator
의 요구사항을 충족해야 합니다.
|
특수화
일반적인 문자 시퀀스 타입에 대한 여러 특수화가 정의되어 있습니다:
|
헤더 파일에 정의됨
<regex>
|
|
| 유형 | 정의 |
std::cregex_iterator
|
std :: regex_iterator < const char * > |
std::wcregex_iterator
|
std :: regex_iterator < const wchar_t * > |
std::sregex_iterator
|
std :: regex_iterator < std:: string :: const_iterator > |
std::wsregex_iterator
|
std :: regex_iterator < std:: wstring :: const_iterator > |
멤버 타입
| 타입 | 정의 |
value_type
|
std:: match_results < 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 > |
데이터 멤버
| 멤버 | 설명 |
BidiIt
begin
(private)
|
시작 반복자
( 설명 전용 멤버 객체* ) |
BidiIt
end
(private)
|
끝 반복자
( 설명 전용 멤버 객체* ) |
const
regex_type
*
pregex
(private)
|
정규 표현식에 대한 포인터
( 설명 전용 멤버 객체* ) |
regex_constants
::
match_flag_type
flags
(private)
|
플래그
( 설명 전용 멤버 객체* ) |
match_results
<
BidiIt
>
match
(private)
|
현재 매치
( 설명 전용 멤버 객체* ) |
멤버 함수
새로운
regex_iterator
를 생성함
(public 멤버 함수) |
|
|
(소멸자)
(암시적으로 선언됨)
|
regex_iterator
를 파괴함 (캐시된 값 포함)
(public 멤버 함수) |
|
내용을 할당함
(public 멤버 함수) |
|
|
(C++20에서 제거됨)
|
두 개의
regex_iterator
를 비교함
(public 멤버 함수) |
|
현재 매치에 접근함
(public 멤버 함수) |
|
|
반복자를 다음 매치로 전진시킴
(public 멤버 함수) |
참고 사항
프로그래머의 책임으로, 반복자의 생성자에 전달된 std::basic_regex 객체가 반복자보다 오래 존재하도록 보장해야 합니다. 반복자가 regex에 대한 포인터를 저장하기 때문에, regex가 소멸된 후 반복자를 증가시키면 댕글링 포인터에 접근하게 됩니다.
정규 표현식에서 일치한 부분이 단순히
단정문(assertion)
(
^
,
$
,
\b
,
\B
)인 경우, 반복자에 저장된 매치는 길이가 0인 매치입니다. 즉,
match
[
0
]
.
first
==
match
[
0
]
.
second
입니다.
예제
#include <iostream> #include <iterator> #include <regex> #include <string> int main() { const std::string s = "Quick brown fox."; std::regex words_regex("[^\\s]+"); auto words_begin = std::sregex_iterator(s.begin(), s.end(), words_regex); auto words_end = std::sregex_iterator(); std::cout << "Found " << std::distance(words_begin, words_end) << " words:\n"; for (std::sregex_iterator i = words_begin; i != words_end; ++i) { std::smatch match = *i; std::string match_str = match.str(); std::cout << match_str << '\n'; } }
출력:
Found 3 words: Quick brown fox.
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
|
LWG 3698
( P2770R0 ) |
C++20 |
regex_iterator
가 스태싱 반복자임에도
forward_iterator
였음
|
input_iterator
[1]
로 변경됨
|
-
↑
iterator_category는 해당 결의로 변경되지 않았습니다. 이를 std::input_iterator_tag 로 변경하면 기존 코드가 너무 많이 손상될 수 있기 때문입니다.
참고 항목
|
(C++11)
|
하나의 정규 표현식 매치와 모든 하위 표현식 매치를 식별함
(클래스 템플릿) |
|
(C++11)
|
문자 시퀀스의 어떤 부분에든 정규 표현식 매치를 시도함
(함수 템플릿) |