Namespaces
Variants

std:: regex_iterator

From cppreference.net
Regular expressions library
Classes
(C++11)
Algorithms
Iterators
regex_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_iterator
(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] 로 변경됨
  1. iterator_category 는 해당 결의로 변경되지 않았습니다. 이를 std::input_iterator_tag 로 변경하면 기존 코드가 너무 많이 손상될 수 있기 때문입니다.

참고 항목

하나의 정규 표현식 매치와 모든 하위 표현식 매치를 식별함
(클래스 템플릿)
문자 시퀀스의 어떤 부분에든 정규 표현식 매치를 시도함
(함수 템플릿)