프로젝트 소개
RE2는 2006년 Google에서 처음 개발된 효율적이고 원칙 있는 정규 표현식 라이브러리입니다. 주요 설계 목표는 안전성으로, 신뢰할 수 없는 사용자가 제공한 정규 표현식을 치명적 백트래킹이나 서비스 거부 공격 위험 없이 처리할 수 있도록 보장합니다. 이는 기존 엔진인 PCRE, Perl, Python의 re 모듈과 달리, 입력 문자열 길이에 대해 매칭 시간이 선형임을 보장합니다.
주요 특징은 다음과 같습니다:
- 안전성: RE2는 재귀를 피하고 설정 가능한 예산을 통해 메모리 사용을 제한하며, 예산이 소진되면 우아하게 실패합니다. 이는 백트래킹 엔진에서 흔히 발생하는 스택 오버플로와 지수적 실행 시간 문제를 방지합니다.
- 성능: 병렬 평가 오버헤드로 인해 단순한 패턴에서는 항상 다른 엔진보다 빠른 것은 아니지만, 대안을 순차적으로 평가하지 않고 병렬로 평가함으로써 복잡한 표현식에서 일관된 성능을 제공합니다.
- 구문 지원: 기본 Perl 모드에서는 대부분의 Perl 연산자를 허용하지만, 백트래킹이 필요한 기능(예: 역참조, 룩어라운드 어설션)은 제외합니다. POSIX 모드에서는 표준 POSIX(egrep) 구문을 지원하며, leftmost-longest 매칭을 수행합니다.
- 유니코드 처리: RE2는 유니코드 코드 포인트를 직접 다루며 정규화를 수행하지 않습니다. 필요한 경우 사용자가 입력과 패턴을 사전에 정규화해야 합니다.
이 라이브러리는 C++로 구현되어 있으며, C++17 컴파일러와 Abseil 라이브러리가 필요합니다. GNU make, CMake, Bazel을 사용해 빌드할 수 있습니다. C++ 네이티브이지만 공식 래퍼가 Python(`google-re2`)에 존재하며, 커뮤니티 포트로 Node.js, Java(RE2J), JavaScript(RE2JS), D, Erlang, OCaml, Perl, R, Ruby, WebAssembly용 버전이 제공됩니다. Go와 Rust 같은 다른 언어에서도 RE2의 원칙을 따르는 유사한 라이브러리가 있지만, 코드를 공유하지는 않습니다.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.