TECH 으로 돌아가기
TECH HACKER NEWS 오늘 6분 읽기 33 READS

'여기선 되는데 저기선 안 돼요' — 어디서나 통하는 정규식 작성법

"여기선 되는데 저기선 안 돼요" 정규식의 함정

정규표현식(정규식, regular expression)은 텍스트에서 특정 패턴을 찾아내는 강력한 도구죠. 이메일 형식 검사하고, 로그에서 원하는 줄만 뽑아내고, 문자열을 치환하고... 개발하다 보면 안 쓰는 곳이 없어요. 그런데 정규식을 좀 써본 분이라면 한 번쯤 이런 황당한 경험 있으실 거예요. 분명히 파이썬에서 잘 되던 정규식을 grep에 그대로 붙여넣었더니 안 먹히는 거죠. 아니면 자바스크립트에서 되던 게 sed에서는 에러가 나거나요.

왜 이런 일이 벌어지냐면, 정규식에는 사실 하나의 표준이 없어요. 도구마다, 언어마다 조금씩 다른 "방언"을 쓰거든요. POSIX 기본형(BRE), 확장형(ERE), PCRE(Perl 호환 정규식), 파이썬, 자바스크립트, vim... 다들 비슷해 보이지만 세부 문법이 미묘하게 달라요. 이 글은 바로 이 혼란 속에서 "어디에 갖다 붙여도 똑같이 동작하는 안전한 정규식 부분집합"이 뭔지를 짚어줘요.

어디서나 통하는 것 vs 도구마다 다른 것

먼저 거의 모든 정규식 엔진에서 똑같이 동작하는 안전한 기본기들이 있어요. 어떤 문자든 하나를 뜻하는 점(.), 앞 문자의 0회 이상 반복을 뜻하는 별표(*), 대괄호로 문자 집합을 묶는 [abc], 줄의 시작과 끝을 뜻하는 ^$ 같은 것들이죠. 이 정도는 grep이든 파이썬이든 자바스크립트든 안심하고 써도 돼요.

문제는 우리가 무심코 자주 쓰는 편리한 단축 문법들이에요. 예를 들어 숫자를 뜻하는 \d, 단어 문자를 뜻하는 \w 같은 건 PCRE나 대부분의 프로그래밍 언어에서는 되지만, 전통적인 POSIX 도구(기본 grep 등)에서는 안 통하는 경우가 많아요. 이게 무슨 말이냐면, \d 대신 [0-9][[:digit:]]처럼 POSIX 문자 클래스를 쓰면 이식성(portability)이 훨씬 좋아진다는 거예요. [[:digit:]], [[:alpha:]] 같은 대괄호 두 겹짜리 표기가 좀 길고 못생겨 보여도, 여러 환경을 넘나들어야 한다면 이게 더 안전한 선택이에요.

그 밖에도 함정이 많아요. 앞에서 찾은 걸 다시 참조하는 역참조(backreference), 특정 패턴 앞뒤를 조건으로 거는 전방·후방 탐색(lookahead/lookbehind), 그룹에 이름을 붙이는 named group 같은 고급 기능들은 엔진마다 지원 여부와 문법이 제각각이에요. 심지어 여러 패턴 중 하나를 뜻하는 OR 기호(|)나 1회 이상 반복을 뜻하는 +조차도, POSIX 기본형(BRE)에서는 앞에 역슬래시를 붙여 \|, \+로 써야 동작하는 식이라 헷갈리죠.

왜 이렇게 갈라졌을까

정규식 엔진들이 이렇게 파편화된 데는 역사가 있어요. 초창기 유닉스 도구들이 각자 나름의 정규식을 구현하면서 POSIX 표준(BRE/ERE)이 자리 잡았는데, 이후 Perl이 훨씬 강력하고 편한 확장 문법을 잔뜩 도입했고 이게 PCRE라는 사실상의 표준이 됐어요. 자바스크립트는 또 ECMAScript 명세에 따른 자기만의 규칙이 있고요. 한편 구글이 만든 RE2처럼, 일부러 역참조 같은 위험한 기능을 빼서 성능과 안전성을 확보한 엔진도 있어요. 그래서 "정규식 = 하나의 언어"가 아니라 "서로 닮은 여러 언어들의 집합"이라고 이해하는 게 정확해요.

한국 개발자에게는?

실무에서 바로 써먹을 교훈은 분명해요. 여러 환경에서 돌아가야 하는 정규식이라면, 화려한 단축 문법을 자제하고 가장 보수적인 표기를 쓰세요. 예를 들어 셸 스크립트, CI 파이프라인, 여러 언어가 섞인 프로젝트에서 같은 패턴을 공유해야 한다면, \d보다 [0-9]를 쓰는 작은 습관 하나가 나중에 디버깅 시간을 크게 줄여줘요.

반대로, 내가 지금 쓰는 도구가 어떤 정규식 방언인지 정확히 알면 그 도구의 강력한 기능을 마음껏 써도 돼요. 중요한 건 "이 정규식이 어디서 돌아갈 것인가"를 먼저 생각하는 습관이에요.

한 줄로 정리하면, "정규식은 표준이 하나가 아니다. 이식성이 필요하면 가장 단순한 공통 문법으로 적어라"는 거예요. 여러분은 환경을 옮겨다니다 정규식이 안 먹혀서 고생한 경험, 있으신가요?


🔗 출처: Hacker News

SOURCE · HACKER NEWS
원문 전체 보기 → https://www.johndcook.com/blog/2026/06/23/regex-everywhere/
SHARE
처리 중...