regex_syntax_option_type

regex_syntax_option_type (정규 표현식 구문 옵션 타입)

이 페이지는 C++ 표준 라이브러리의 std::regex::syntax_option_type에 대해 설명해요. 이 타입은 정규 표현식의 구문과 동작 방식을 제어하는 비트마스크 타입이에요. 다양한 문법 옵션과 변형 옵션을 제공해서 원하는 정규 표현식 동작을 선택할 수 있어요.

출처: cppreference

본문

<regex> 헤더에 정의됨
using syntax_option_type = /* implementation-defined */ ; (1) (C++11부터)
constexpr syntax_option_type icase = /* unspecified / ; constexpr syntax_option_type nosubs = / unspecified / ; constexpr syntax_option_type optimize = / unspecified / ; constexpr syntax_option_type collate = / unspecified / ; constexpr syntax_option_type ECMAScript = / unspecified / ; constexpr syntax_option_type basic = / unspecified / ; constexpr syntax_option_type extended = / unspecified / ; constexpr syntax_option_type awk = / unspecified / ; constexpr syntax_option_type grep = / unspecified / ; constexpr syntax_option_type egrep = / unspecified */ ; (2) (C++11부터) (C++17부터 inline)
inline constexpr syntax_option_type multiline = /* unspecified */ ; (3) (C++17부터)

상수 (Constants)

문법 옵션 효과
ECMAScript 수정된 ECMAScript 정규 표현식 문법을 사용해요.
basic 기본 POSIX 정규 표현식 문법을 사용해요 (문법 문서).
extended 확장 POSIX 정규 표현식 문법을 사용해요 (문법 문서).
awk POSIX에서 awk 유틸리티가 사용하는 정규 표현식 문법을 사용해요 (문법 문서).
grep POSIX에서 grep 유틸리티가 사용하는 정규 표현식 문법을 사용해요. 이는 기본적으로 basic 옵션에 줄바꿈 '\n'을 대체(alternation) 구분자로 추가한 것과 같아요.
egrep POSIX에서 -E 옵션을 사용한 grep 유틸리티가 사용하는 정규 표현식 문법을 사용해요. 이는 기본적으로 extended 옵션에 `'
문법 변형 효과
--- ---
icase 문자 대소문자를 구분하지 않고 매칭을 수행해요.
nosubs 매칭을 수행할 때 모든 표시된 하위 표현식 (expr)을 비표시 하위 표현식 (?:expr)으로 취급해요. std::regex_match 구조체에 저장되는 매치는 없고 mark_count()는 0이 돼요.
optimize 정규 표현식 엔진이 매칭을 더 빠르게 수행하도록 지시해요. 대신 생성 시간이 느려질 수 있어요. 예를 들어 비결정적 FSA를 결정적 FSA로 변환하는 것을 의미할 수 있어요.
collate "[a-b]" 형태의 문자 범위가 로케일을 따르도록 해요.
multiline (C++17) ECMAScript 엔진이 선택된 경우 ^는 줄의 시작, $는 줄의 끝과 매칭되도록 지정해요.

ECMAScript, basic, extended, awk, grep, egrep 중에서 최대 하나의 문법 옵션만 선택할 수 있어요. 문법이 선택되지 않으면 ECMAScript가 선택된 것으로 간주해요. 다른 옵션들은 변형으로 동작해요. 예를 들어 std::regex("meow", std::regex::icase)std::regex("meow", std::regex::ECMAScript | std::regex::icase)와 동일해요.

참고 사항 (Notes)

POSIX는 "leftmost longest" 매칭 규칙(가장 긴 매칭 부분 수열을 매칭하고, 그러한 부분 수열이 여러 개 있으면 첫 번째 것을 매칭)을 사용하기 때문에, 예를 들어 마크업 언어를 파싱하는 데는 적합하지 않아요. <tag[^>]*>.*</tag> 같은 POSIX 정규 표현식은 첫 번째 <tag>부터 마지막 </tag>까지, 그 사이의 모든 </tag><tag>를 포함해 매칭하게 돼요. 반면 ECMAScript는 비탐욕적(non-greedy) 매칭을 지원하며, ECMAScript 정규 표현식 <tag[^>]*>.*?</tag>는 첫 번째 닫는 태그까지만 매칭해요.

예제 (Example)

ECMAScript와 POSIX 정규 표현식의 매칭 알고리즘 차이를 보여줘요:

#include <iostream>
#include <regex>
#include <string>

int main()
{
    std::string str = "zzxayyzz";
    std::regex re1(".*(a|xayy)"); // ECMA
    std::regex re2(".*(a|xayy)", std::regex::extended); // POSIX
    
    std::cout << "Searching for .*(a|xayy) in zzxayyzz:\n";
    std::smatch m;
    std::regex_search(str, m, re1);
    std::cout << "  ECMA (depth first search) match: " << m[0] << '\n';
    std::regex_search(str, m, re2);
    std::cout << "  POSIX (leftmost longest)  match: " << m[0] << '\n';
}

출력:

Searching for .*(a|xayy) in zzxayyzz:
  ECMA (depth first search) match: zzxa
  POSIX (leftmost longest)  match: zzxayy

결함 보고서 (Defect reports)

다음 동작 변경 결함 보고서는 이전에 발표된 C++ 표준에 소급 적용됐어요.

DR 적용 대상 발표된 동작 올바른 동작
LWG 2053 C++11 상수들이 static으로 선언됨 static 지정자 제거

같이 보기 (See also)

basic_regex (C++11) 정규 표현식 객체 (클래스 템플릿) [편집]

더 알아보기 (Learn more)

cppreference