std::regex_constants:: syntax_option_type
|
헤더 파일에 정의됨
<regex>
|
||
|
using
syntax_option_type
=
/* implementation-defined */
;
|
(1) | (C++11부터) |
|
constexpr
syntax_option_type icase
=
/* unspecified */
;
constexpr
syntax_option_type nosubs
=
/* unspecified */
;
|
(2) |
(C++11부터)
(C++17부터 inline) |
|
inline
constexpr
syntax_option_type multiline
=
/* unspecified */
;
|
(3) | (C++17부터) |
목차 |
상수
| 문법 옵션 | 효과 |
ECMAScript
|
수정된 ECMAScript 정규 표현식 문법 을 사용합니다. |
basic
|
기본 POSIX 정규 표현식 문법을 사용합니다 ( 문법 문서 ). |
extended
|
확장 POSIX 정규 표현식 문법을 사용합니다 ( 문법 문서 ). |
awk
|
POSIX에서 awk 유틸리티가 사용하는 정규 표현식 문법을 사용합니다 ( 문법 문서 ). |
grep
|
POSIX에서
grep
유틸리티가 사용하는 정규 표현식 문법을 사용합니다. 이는 기본적으로
basic
옵션과 동일하지만, 줄바꿈
'
\n
'
을 대체 구분자로 추가합니다.
|
egrep
|
POSIX에서
grep
유틸리티가
-E
옵션과 함께 사용하는 정규 표현식 문법을 사용합니다. 이는 기본적으로
extended
옵션과 동일하지만,
'|'
에 추가로 줄바꿈
'
\n
'
을 대체 구분자로 추가합니다.
|
| 문법 변형 | 효과 |
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
)
와 동등합니다.
참고 사항
POSIX는 "가장 왼쪽에서 가장 긴" 매칭 규칙(가장 긴 매칭 부분 시퀀스를 매칭하며, 그러한 부분 시퀀스가 여러 개 있을 경우 첫 번째 것을 매칭함)을 사용하기 때문에, 예를 들어 마크업 언어를 파싱하는 데 적합하지 않습니다: POSIX 정규식 "<tag[^>]*>.*</tag>" 는 첫 번째 "<tag" 부터 마지막 "</tag>" 까지의 모든 내용을 매칭하며, 그 사이에 있는 모든 "</tag>" 와 "<tag>" 를 포함합니다. 반면에 ECMAScript는 비탐욕적(non-greedy) 매칭을 지원하며, ECMAScript 정규식 "<tag[^>]*>.*?</tag>" 는 첫 번째 닫는 태그까지만 매칭합니다.
예제
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
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 2053 | C++11 | 상수들이 static 으로 선언됨 | static 지정자를 제거함 |
참고 항목
|
(C++11)
|
정규 표현식 객체
(클래스 템플릿) |