JS

자바스크립트 정규식에서의 문자범위지정

아거스 2010. 12. 9. 01:37

정규식은 자바스크립트외 타 언어에서도 지원하는 부분(일부분은 다르지만)으로
원하는 문자열을 찾고 치환하고 제거하는 등의 막강한 기능을 지원한다.

정규식 패턴을 만드는 방법에는 여러가지의 방법이 존재하지만
이 중 문자범위를 지정하는 부분에 대해서 논하고자 한다.

간혹 영문자에 대한 패턴을 원한다고 [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개의 맵이 존재하며, 중복되는 글자도 꽤나 있음을 알 수 있다.

한글 자모 (Hangul Jamo)

한글 초성 ㄱ: 1100 ~ 한글 종성, 여린히읗:11F9
※ 여린히읗(된이응)은, "ㅎ"에서 맨 위의 점이 없는 것입니다. 즉, 수평선 밑에 동그라미 하나가 있는 모양

한글 호환 자모 (Hangul Compatibility Jamo)

ㄱ: 3131~아래아 이: 318E
※ "아래아 이"는 현대 한글의 "이"와 같지만, 이응 대신에 아래아가 있습니다. 즉, 동그라미 대신에 점이 한 개 찍혀 있음
※ 키보드로 한글 자모(ㄱㄴㄷㄹ, ㅏㅑㅓㅕ)를 입력할 때 이 영역이 사용

한글 음절 (Hangul Syllables)

가: AC00 ~ 힣: D7A3
※ 가장 중요한 한글 영역. 현대 한글 낱자 11172자가 모두 들어 있음

한글 반각 자모 (Halfwidth Jamo / Halfwidth Hangul variants)

(반각) ㄱ: FFA1 ~ (반각) ㅣ: FFDC

※ 위의, "ㅣ" 는, 숫자1이나, 알파벳l이 아니라, 한글 모음 "이"
※ 이 부분은 쓰이지 않음

즉 한글의 매칭 패턴에 있어서도 영문자와 마찬가지로 원하는 영역의 범위[ㄱ-ㅣ가-힣]를 지정하여 성능향상을 꽤할 수 있음을 알 수 있다.

※캐릭터 전체에 대한 패턴입니다. 조건부 패턴이 아님을 명시 합니다.

References