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) | 정규 표현식 객체 (클래스 템플릿) [편집] |
|---|