2017년 12월 17일 일요일

VIM 8.0 버그 하나

'데이터 분석이 쉬워지는 정규표현식' 222페이지에 "‘[^\s]’는 ‘[^s]’와 같다"란 구절이 있다. VIM 정규표현식 문자클래스는 PCRE와 달리 메타문자를 인식하지 않기 때문에 '공백 문자'를 의미하는 메타 문자 '\s'를 입력해도 '공백'이 아닌, 순수 문자 's'를 검사한다는 의미.

그런데 어느 독자분이 '[\s]'는 '\'도 검사하기 때문에 '[s]'와 검사 결과가 다르다는 의견을 보내주셨다. 윤종욱님 감사(__)

다음은 테스트 결과. 정말 '\'가 검사된다.


문자클래스에 '\'만 입력하면 어떻게 될까? 결과는 다음과 같다. VIM 정규표현식과 PCRE 모두 검사 실패.



순수 문자 '\'만을 검사하기 위해서는 VIM 정규표현식과 PCRE 모두 예외처리, 즉 '\'를 두 번 입력해줘야 한다.



그런데 왜 '[\s]'는 '\'를 검사하지? 문자클래스에 '\'를 단독 입력했을 때는 검사하지 못하기 때문에 아무래도 버그로 보인다.아니면 개발자만의 뭔가 심오한 철학이

테스트 과정에서 재밌는 점도 하나 발견했다. VIM 정규표현식은 16진수 범위를 검사하는 메타문자 '\x'를 지원한다.


PCRE는 해당 메타문자를 지원하지 않는데, 문자클래스를 이용해도 순수 문자 'x'조자 검사하지 못한다.



반면 메타문자가 아닌 문자를 이용한 표현식 '[\y]'를 이용하면 순수 문자 'y'를 검사한다. 지원하는 메타문자는 문자클래스에서 인식, 지원하지 않는 메타문자는 순수 문자로도 인식하지 않고, 아예 무시한다는 얘기.



또 하나, VIM 정규표현식은 문자클래스에서 메타문자를 인식하지 않는다고 했는데, 인식하는 것도 있다. 일관성이라곤 없는 녀석(..)

문자클래스에서 인식되는 탭문자

문자클래스에서 인식되는 줄바꿈문자

댓글 없음:

댓글 쓰기

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