Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ std::regex_error 완벽 가이드 – 정규식 오류 종류와 예외 처리 방법

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를 활용하면 정규 표현식 관련 오류를 프로그램 실행 중에 안전하게 감지할 수 있으며, 오류 유형에 따라 사용자에게 알림을 보내거나 대체 로직을 수행하는 등의 적절한 대응이 가능합니다.