“어디서나” 동작하는 정규 표현식

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는 숫자에 대한 기본 기능처럼 보일 수 있지만 많은 정규 표현식 변형에서 지원되지 않음
Read Entire Article