“어디서나” 동작하는 정규 표현식
1 day ago
2
- 정규 표현식은 구현마다 지원 기능과 문법이 달라, 한 도구에서 통하던 패턴이 다른 환경에서는 실패하거나 수정이 필요할 수 있음
- Perl처럼 기능이 많은 환경에 익숙할수록 호환성 문제를 더 자주 만나며, 설치 권한이 없는 컴퓨터까지 고려하면 공통 부분집합을 쓰는 편이 안전함
- “어디서나”를 가장 엄격하게 정의하면 리터럴, […] 문자 클래스, . * ^ $ 같은 기본 특수 문자만 남을 정도로 범위가 좁아짐
- GNU sed, awk, grep에 sed와 grep의 -E 옵션을 함께 쓰면 활용 가능한 공통 기능이 넓어지지만, 이 조합에서는 awk가 대체로 최소 공통분모가 됨
- Emacs는 +? ( ) { } |에 백슬래시가 필요하고 \s, \S의 의미도 달라, 같은 정규 표현식을 여러 도구에 쓰려면 예외 문법까지 확인해야 함
정규 표현식 호환성이 어려운 이유
- 정규 표현식의 가장 큰 불편은 구현별 차이에서 나옴
- 어떤 도구에서 지원되는 기능이 다른 도구에서는 아예 없을 수 있음
- 같은 기능이라도 문법이 조금씩 다를 수 있음
- Perl은 기능이 많은 정규 표현식 환경이라, Perl 기준으로 당연해 보이는 기능이 다른 환경에서는 빠져 있을 때가 있음
- 다른 도구의 Perl 유사 대체품을 쓰는 방법도 있지만 표준적이지 않아, 동료나 고객에게 바로 실행되는 코드를 보내기 어려워짐
- 소프트웨어를 설치할 수 없는 컴퓨터에서 작업해야 하는 상황까지 고려하면, 여러 환경에서 동작하는 정규 표현식 기능의 부분집합을 찾는 접근이 필요함
- “어디서나”의 정의를 엄격하게 잡을수록 사용할 수 있는 기능은 줄어듦
- 리터럴
- […] 문자 클래스
- . * ^ $ 특수 문자
sed, awk, grep, Emacs에서의 공통 범위
- 대상 도구를 sed, awk, grep, Emacs로 좁히면 “어디서나”의 기준을 조금 느슨하게 잡을 수 있음
- GNU 버전의 sed, awk, grep을 쓰고 sed와 grep에 -E 옵션을 적용하면 공통 기능 목록이 넓어짐
- 세 도구의 정규 표현식 기능은 비슷함
- awk 기능은 다른 도구에서도 대체로 지원됨
- 예외적으로 단어 경계는 awk에서 \<, \>를 쓰며, \b, \B와 다름
- Emacs는 awk 기능 대부분에 대응하지만 문법 차이가 있음
- + ? ( ) { } |가 awk와 같은 역할을 하려면 앞에 백슬래시가 필요함
- awk의 \s, \S에 해당하는 표현은 Emacs에서 \s-, \S-임
- Emacs에서 \s, \S는 공백/비공백이 아니라 문자 클래스를 시작함
- - 클래스는 공백을 뜻함
- \s.는 구두점 문자
- \S.는 비구두점 문자
- 이 기준에서 사용할 수 있는 기능은 다음과 같음
- .
- ^, $
- […], [^…]
- *
- \w, \W, \s, \S
- \1부터 \9까지의 역참조
- \b, \B
- ?, +
- | 대안
- {n,m} 반복 횟수
- (...) 캡처
- 단, gawk는 치환 문자열에서는 역참조를 지원하지만 정규 표현식 자체에서는 역참조를 지원하지 않음
- look-around는 고급 기능으로 볼 수 있고, \d는 숫자에 대한 기본 기능처럼 보일 수 있지만 많은 정규 표현식 변형에서 지원되지 않음
-
Homepage
-
Tech blog
- “어디서나” 동작하는 정규 표현식