자주 쓰는 문자 클래스에는 축약형이 있어
\d, \w, \s는 각각 숫자, 단어 문자, 공백 문자를 나타내는 축약 문자 클래스야. ASCII 기준으로 보면 \d는 [0-9], \w는 [A-Za-z0-9_]에 가깝지만, 실제 범위는 엔진과 모드에 따라 달라져.
Python, JavaScript, PCRE, Java, .NET, Go, Rust regex 등은 이 문법을 지원해. 반면 POSIX BRE/ERE의 공통 문법은 아니므로, 다른 도구로 패턴을 옮길 때는 지원 여부부터 확인해야 해.
유니코드 처리 방식은 엔진마다 달라
- Python 3: 기본 모드의
\d,\w,\s는 유니코드를 인식해. ASCII로 제한하려면re.ASCII를 사용해. - JavaScript: 기본 축약 클래스는 ASCII 중심이야.
u플래그만 켠다고\w가 모든 유니코드 문자를 포함하지는 않으므로, 문자 범주가 필요하면\p{L}같은 속성 이스케이프를 함께 사용해. - RE2와 Go:
\d,\w,\s는 ASCII 의미를 사용해. 유니코드 범주는\p{Nd},\pL처럼 따로 적어. - ripgrep의 기본 Rust regex 엔진: 유니코드 모드가 기본이라
\w도 유니코드를 인식해. 필요하면--no-unicode로 제한할 수 있어. - PCRE: 기본 축약 클래스는 ASCII 의미야. 유니코드 속성을 적용하려면
(*UCP)나PCRE2_UCP가 필요하고, 비 ASCII 코드 포인트를 처리하는 UTF 모드도 따로 확인해야 해.
\w에는 밑줄이 들어가지만 하이픈은 없어
\w+는 my_var를 한 덩어리로 찾지만 my-var에서는 하이픈 앞뒤가 갈라져. 하이픈까지 허용하려면 의도를 숨기지 말고 [\w-]+처럼 직접 적어.