2016년 2월 25일 목요일

정규표현식 도움 사이트들

정규표현식을 쓰다 보면 종종 형편없는 가독성에 학을 떼곤 하는데, 그럴 때마다 정신줄을 붙잡을 수 있게 도와주는 사이트들이 몇 개 있어서 소개할까 한다. 첫 번째 사이트는 Snort 분석 사례에서 몇 번 소개했었던, 정규표현식의 구조를 정말 깔끔하고 예쁘게 도식화해주는 'regexper.com'.


간단한 사례를 보자. 정규표혀식 '[A-Z]\w*'를 입력한 후, 'Display' 메뉴를 클릭하면 아래 해당 표현식의 도식이 나타난다.


① 'One of' 표식은 알파벳 대문자 중 하나가 선택되는, 문자 클래스를 이용한 표현식 '[A-Z]'를,
② 'word' 표식은 메타문자 '\w'를,
③ 'word' 표식을 건너뛰는 반원(?)은 '\w'의 수량이 0개 이상임을 의미하는 수량자 '*'를 도식화한 것이다. 최소 수량이 0개이므로 '\w'를 무시할 수 있다는 의미.
④ 'word' 표식 아래 타원을 도는 화살표는 '\w'의 최소 수량은 0개이지만, 최대 수량은 무한대로 반복될 수 있음을 의미한다. 상당히 직관적으로 도식을 그려준다는 사실을 알 수 있다.

'regexper.com'의 한 가지 단점이라면 JavaScript 환경이다 보니 몇 가지 정규표현식의 기능을 지원하지 못한다는 것. 다음 그림에서 'positive lookahead' 표식은 긍정형 전방탐색을 이용한 표현식 '(?=com)'를 도식화한 것이다. 참고로 '+' 수량자를 사용하면 수량을 1개 이상으로 제한하므로 건너뛰는 반원이 표시되지 않는다.


여기까지는 좋은데 아쉽게도 JavaScript 정규표현식은 후방탐색 등 PCRE 환경에서 자주 쓰이는 기능을 지원하지 않는다. 그래서 긍정형 후방탐색을 이용한 '(?<=www)'와 같은 표현식은 도식으로 그려주지 못한다.


그런데 우연히 JavaScript는 물론 PCRE와 Python 정규표현식까지 지원해주는 'www.debuggex.com'이란 사이트를 발견했다.


'regexper.com'에서 그려주지 못하던, 'www로 시작해서 com으로 끝나는' 특정 패턴을 찾는 '(?<=www)[A-Z]\w+(?=com)' 표현식의 도식을 멋지게 그려준다. 다만 'regexper.com'처럼 예쁘지는 않다. 직관성이 좀 떨어진다는 얘기. 그래도 이게 어디냐 싶음. ('regexper.com'을 먼저 사용해서 그런 듯도)


'regexr.com'이랑, 'regex101.com' 두 개 더 있는데 귀차니즘이 발동해서 소개는 다음 기회에 해야할 듯. 요즘 벌린 일들이 점점 커지는 느낌이라 어떻게 잘 마무리할까 하는 궁리에 머리속이 좀 복잡하다. -_-

추가
정규표현식의 도식화를 통해 구조 파악을 도와주는 사이트에 이어서 소개할 세 번째 사이트는 정규표현식의 정상 동작 여부를 테스트 해주는 'regexr.com'. 이 사이트 역시 정규표현식의 성격별 색깔 구분을 통해 구조를 파악할 수 있게 해준다. (물론 도식으로 보는 게 백만 배 편함)


정규표현식 테스트할 때 가장 많이 이용하는 사이트가 'regexr.com'과 'regexper.com'인데 이유는 순전히 인터페이스가 너무 깔끔하고 예뻐서. 다만 둘 다 JavaScript 환경이다 보니 앞서 언급한 것처럼 정규표현식의 모든 기능을 지원하지는 않는다.

'debuggex.com'은 다 갖추고 있긴 한데 인터페이스가 좀 구리고(..) 분명 빠방한 기능에 인터페이스도 예쁜 사이트가 있을거라 생각하고 뒤져보니 진짜 있다.

바로 'regex101.com'. ('프로듀스101'이랑은 아무 관계 없음. 박민지양 떨어져서 아쉽더라. 보컬 시원하니 좋던데. 그리고 엠넷 이놈들아 적당히 해라 -_-)


PCRE, JavaScript, Python 정규표현식을 모두 지원하는 것도 이 사이트의 장점이지만, 진짜 백미는 정규표현식의 패턴매칭 과정을 보여주는 디버깅 기능. 디버깅 기능을 통해 정규표현식에서 굉장히 중요한 개념인 백트래킹의 동작 메커니즘도 살펴볼 수 있다.


정규표현식 'E\w+n'은 'E'로 시작해서 'n'으로 끝나는 '하나 이상의 문자(\w+)'를 검색한다. 그림을 보면 검사 대상 문자열인 'Expression'은 3단계에서 이미 'E\w+n' 표현식만으로 검색이 끝났다는 사실을 알 수 있다. 'n'이 '\w+'의 검사 범위에 포함되기 때문.

하지만 표현식은 아직 다 실행되지 않았고, 마지막 표현식(E\w+n)을 실행하기 위해 4단계에서 최종 검색 결과 중 마지막 문자 하나를 포기한다. (Expression) 백트래킹이 일어나는 것이다. 결국 5단계에서 마지막 표현식(E\w+n)에 의해 'Expression'의 마지막 문자 'n'을 다시 검색하고 나서야 전체 정규표현식의 실행이 끝난다.

검색 결과를 포기했다가 다시 검색하는, 어떻게 보면 매우 비효율적인 동작 메커니즘으로도 보이지만 무한한 경우의 수를 갖는 패턴매칭을 가능하게 해주는 정규표현식의 필수 개념이라고 보면 되겠다. 난해한 백트래킹 과정을 눈으로 볼 수 있게 해주는 너무 고마운 사이트라 거금 10달러 쾌척. 이런 도우미들이 함께 해주니 정규표현식이 살짝 만만해 보이기 시작한다.

댓글 없음:

댓글 쓰기

크리에이티브 커먼즈 라이선스