std::regex_error란 무엇인가?
C++의 <regex> 라이브러리는 정규 표현식(regular expression)과 관련된 다양한 메서드와 기능을 제공합니다. 정규 표현식을 컴파일하거나 실행하는 과정에서 문법 오류, 리소스 부족 등의 문제가 발생하면 std::regex_error 예외가 던져지며, 이 예외는 어떤 종류의 오류인지 식별할 수 있는 오류 코드(error flag)를 함께 가지고 있습니다.
아래 표는 regex 라이브러리에 정의된 주요 오류 플래그와 그 의미를 정리한 것입니다.
regex_error의 주요 오류 플래그
| 플래그(Flags) | 오류 설명 |
|---|---|
| error_collate | 정규식에 유효하지 않은 조합(collation) 요소 이름이 포함된 경우 |
| error_ctype | 정규식에 유효하지 않은 문자 클래스 이름이 포함된 경우 |
| error_stack | 정규식이 매칭 가능한지 판단하기 위한 메모리(스택)가 부족한 경우 |
| error_space | 정규식을 유한 상태 머신(Finite State Machine)으로 변환할 때 메모리가 부족한 경우 |
| error_badrepeat | 반복 지정자(* ? + {) 앞에 유효한 정규 표현식이 먼저 오지 않은 경우 |
| error_complexity | 매칭 시도의 복잡도가 미리 설정된 임계 수준을 초과한 경우 |
| error_range | 유효하지 않은 문자 범위(character range)가 포함된 경우 |
| error_badbrace | 정규식에 중괄호 { 와 } 의 짝이 맞지 않게 포함된 경우 |
| error_brace | 정규식의 중괄호 { 와 } 사이에 유효하지 않은 범위 값이 있는 경우 |
| error_paren | 정규식에 소괄호 ( 와 ) 의 짝이 맞지 않게 포함된 경우 |
| error_brack | 정규식에 대괄호 [ 와 ] 의 짝이 맞지 않게 포함된 경우 |
| error_backref | 정규식에 유효하지 않은 역참조(back reference)가 포함된 경우 |
| error_escape | 정규식에 유효하지 않은 이스케이프 문자나, 뒤따르는 문자 없이 끝나는 불완전한 이스케이프가 포함된 경우 |
예제 코드
다음 예제는 대괄호 표현식(bracket expression)의 짝이 맞지 않아 오류가 발생하는 정규 표현식을 try-catch 블록으로 처리하는 방법을 보여줍니다.
#include <iostream>
#include <regex>
int main() {
try {
std::regex re("[A-Z][0"); // 오류가 존재하는 정규 표현식
} catch (const std::regex_error& err) {
std::cout << "오류가 발생했습니다. 오류 내용: " << err.what() << '\n';
if (err.code() == std::regex_constants::error_brack) {
std::cout << "error_brack 오류 코드입니다\n";
}
}
}
실행 결과
오류가 발생했습니다. 오류 내용: 대괄호 표현식에 예상치 못한 문자가 있습니다. error_brack 오류 코드입니다
코드 설명
예제에서 사용된 정규 표현식 [A-Z][0은 여는 대괄호 [가 닫히지 않아 문법적으로 잘못되었습니다. 따라서 std::regex 객체를 생성하는 시점에 regex_error 예외가 발생하고, catch 블록이 이를 잡아 처리합니다.
- err.what() : 발생한 오류에 대한 설명 문자열을 반환합니다.
- err.code() : 오류의 종류를 나타내는
std::regex_constants::error_type값을 반환합니다. 예제에서는 이 값이error_brack과 같은지 비교하여 오류 유형을 확인합니다.
이처럼 regex_error를 활용하면 정규 표현식 관련 오류를 프로그램 실행 중에 안전하게 감지할 수 있으며, 오류 유형에 따라 사용자에게 알림을 보내거나 대체 로직을 수행하는 등의 적절한 대응이 가능합니다.