Namespaces
Variants

Regular expressions library (since C++11)

From cppreference.net

정규 표현식 라이브러리는 문자열 내에서 패턴 매칭을 수행하는 데 사용되는 일종의 미니 언어인 정규 표현식 을 나타내는 클래스를 제공합니다. regex를 사용하는 거의 모든 작업은 다음과 같은 여러 객체를 조작하는 것으로 특징지을 수 있습니다:

  • 대상 시퀀스 . 패턴을 검색하는 대상 문자 시퀀스입니다. 이는 두 반복자로 지정된 범위, 널 종료 문자열 또는 std::string 일 수 있습니다.
  • 패턴 . 이것은 정규 표현식 자체입니다. 무엇이 일치하는지를 결정합니다. 특별한 문법 을 가진 문자열로부터 생성된 std::basic_regex 타입의 객체입니다.
  • 매칭된 배열 . 매치에 대한 정보는 std::match_results 타입의 객체로 검색할 수 있습니다.
  • 대체 문자열 . 이는 일치 항목을 대체하는 방법을 결정하는 문자열입니다.

목차

정규 표현식 문법

패턴 및 대체 문자열은 다음 정규식 문법을 지원합니다:

  • 수정된 ECMAScript 정규 표현식 문법 . 이것은 기본 문법입니다.
  • 기본 POSIX 정규 표현식 문법 .
  • 확장 POSIX 정규 표현식 문법 .
  • POSIX에서 awk 유틸리티가 사용하는 정규 표현식 문법.
  • POSIX에서 grep 유틸리티가 사용하는 정규 표현식 문법. 이는 기본 POSIX 정규 표현식 문법과 실질적으로 동일하며, 새 줄 ' \n ' 을 교체 구분자로 추가한 것입니다.
  • POSIX에서 grep 유틸리티가 - E 옵션과 함께 사용하는 정규 표현식 문법. 이는 확장 POSIX 정규 표현식 문법과 실질적으로 동일하며, '|' 에 추가로 새 줄 ' \n ' 을 교체 구분자로 추가한 것입니다.

일부 문법 변형(예: 대소문자 구분 없는 매칭)도 사용 가능합니다. 자세한 내용은 이 페이지 를 참조하십시오.

주요 클래스

이러한 클래스들은 정규 표현식과 대상 문자 시퀀스 내에서 정규 표현식 매칭 결과를 캡슐화합니다.

정규 표현식 객체
(클래스 템플릿)
(C++11)
부분 표현식에 의해 매칭된 문자 시퀀스를 식별함
(클래스 템플릿)
하나의 정규 표현식 매치와 모든 부분 표현식 매치를 식별함
(클래스 템플릿)

알고리즘

이 함수들은 정규 표현식으로 캡슐화된 regex를 대상 문자 시퀀스에 적용하는 데 사용됩니다.

정규 표현식을 전체 문자 시퀀스와 일치시키려 시도합니다
(함수 템플릿)
정규 표현식을 문자 시퀀스의 일부와 일치시키려 시도합니다
(함수 템플릿)
정규 표현식의 발생을 형식화된 대체 텍스트로 교체합니다
(함수 템플릿)

반복자

정규식 반복자는 시퀀스 내에서 발견된 정규 표현식 일치 항목 전체를 순회하는 데 사용됩니다.

문자 시퀀스 내의 모든 정규식 일치 항목을 반복합니다
(클래스 템플릿)
주어진 문자열 내의 모든 정규식 일치에서 지정된 부분 표현식을 반복하거나 일치하지 않는 부분 문자열을 반복합니다
(클래스 템플릿)

예외

이 클래스는 정규 표현식 라이브러리에서 오류를 보고하기 위해 예외로 던져지는 객체의 유형을 정의합니다.

정규 표현식 라이브러리에서 생성된 오류를 보고함
(클래스)

Traits

정규식 특성 클래스는 정규식의 지역화 가능한 측면을 캡슐화하는 데 사용됩니다.

regex 라이브러리에서 요구되는 문자 타입에 대한 메타정보를 제공함
(클래스 템플릿)

상수

다음 네임스페이스에 정의됨 std::regex_constants
정규식 동작을 제어하는 일반 옵션
(typedef)
매칭에 특화된 옵션들
(typedef)
(C++11)
다양한 유형의 매칭 오류를 설명
(typedef)

예제

#include <iostream>
#include <iterator>
#include <regex>
#include <string>
int main()
{
    std::string s = "Some people, when confronted with a problem, think "
        "\"I know, I'll use regular expressions.\" "
        "Now they have two problems.";
    std::regex self_regex("REGULAR EXPRESSIONS",
        std::regex_constants::ECMAScript | std::regex_constants::icase);
    if (std::regex_search(s, self_regex))
        std::cout << "Text contains the phrase 'regular expressions'\n";
    std::regex word_regex("(\\w+)");
    auto words_begin = 
        std::sregex_iterator(s.begin(), s.end(), word_regex);
    auto words_end = std::sregex_iterator();
    std::cout << "Found "
              << std::distance(words_begin, words_end)
              << " words\n";
    const int N = 6;
    std::cout << "Words longer than " << N << " characters:\n";
    for (std::sregex_iterator i = words_begin; i != words_end; ++i)
    {
        std::smatch match = *i;
        std::string match_str = match.str();
        if (match_str.size() > N)
            std::cout << "  " << match_str << '\n';
    }
    std::regex long_word_regex("(\\w{7,})");
    std::string new_s = std::regex_replace(s, long_word_regex, "[$&]");
    std::cout << new_s << '\n';
}

출력:

Text contains the phrase 'regular expressions'
Found 20 words
Words longer than 6 characters:
  confronted
  problem
  regular
  expressions
  problems
Some people, when [confronted] with a [problem], think 
"I know, I'll use [regular] [expressions]." Now they have two [problems].