자바스크립트 정규식에서의 문자범위지정
정규식은 자바스크립트외 타 언어에서도 지원하는 부분(일부분은 다르지만)으로
원하는 문자열을 찾고 치환하고 제거하는 등의 막강한 기능을 지원한다.
정규식 패턴을 만드는 방법에는 여러가지의 방법이 존재하지만
이 중 문자범위를 지정하는 부분에 대해서 논하고자 한다.
간혹 영문자에 대한 패턴을 원한다고 [A-z]처럼 범위지정을 사용을 할 수 있다.
(그런데 검색을 해보면 대부분은 저렇게 쓰지 않고 이 다음 절에서 말하는 방식을 주로 쓴다.)
이쯤에서 ASCII CODE TABLE을 살펴보면
대문자 A~Z는 65~90
소문자 a~z는 97~122
에 할당되어 있는것을 볼 수 있다.
즉, 범위를 [A-z]로 할 경우 알파벳 소문자, 대문자 외에도
ASCII 91~96까지인 ( [, \, \, ^, _, ` )도 패턴에 포함됨을 알 수 있다.
var str = "[\\]^_`", pattern = /[A-z]/g;console.log( str.match(pattern) );
그렇기에 [a-zA-Z]와 같이 명확한 범위를 나타내는 패턴을 사용하는 것이 알맞다.
그렇다면 한글은 어떨까? 한글도 마찬가지의 경우이다.
한글 매칭 패턴으로 [ㄱ-힣]을 사용할 수도 있을것 같지만 이 경우는 UNICODE집합이기 때문에 성능에 지대한 영향을 끼친다.
한글에서의 ㄱ은 Unicode code point가 U+3131인 반면 힣의 경우는 U+D7A3로 그 사이에는 엄청난 캐릭터가 난재되어 있음을 알 수 있다.
var str = "㈜", p = /[ㄱ-힣]/g;alert(str.match(p));
참고로 unicode에서의 한글영역은 아래와 같이 4개의 맵이 존재하며, 중복되는 글자도 꽤나 있음을 알 수 있다.
즉 한글의 매칭 패턴에 있어서도 영문자와 마찬가지로 원하는 영역의 범위[ㄱ-ㅣ가-힣]를 지정하여 성능향상을 꽤할 수 있음을 알 수 있다.
※캐릭터 전체에 대한 패턴입니다. 조건부 패턴이 아님을 명시 합니다.