2009.04.10 19:27
문서에서 단어를 추출하는 작업을 하고 있는데,
문자열에서 한글만 가져와야 할 일이 생겼습니다.

문자열에서 한글만을 가져오기 위해 두 가지 방법을 생각했습니다.
일단 한글이 정의되어 있는 유니코드 영역은 AC00-D7AF, 1100-11FF, 3130-318F입니다.
이 영역에 대해서는 [유니코드] 한글과 한자 영역 또는 http://www.unicode.org/charts/에서  Korean-specific 부분을 참조해주세요.

첫번째는 그냥 첫번째 문자부터 읽어서 한글이면 StringBuffer에 append하고 아니면 공백문자를 append하는 방법입니다.

위와 같이 무식하게 char하나하나 확인하는 방법이 되겠습니다.

두번째는 정규표현식을 사용해서 한글이 아닌 문자를 공백문자로 바꾸는 것입니다.
아래와 같이 replaceAll 의 첫번째 argument에는 정규표현식을, 두번째 argument에는 대신 교체된 공백문자를 넣습니다.

정규표현식은 두가지를 고려했습니다.
1. [^\uAC00-\uD7AF\u1100-\u11FF\u3130-\u318F]
이 첫번째 정규표현식은 문자 하나하나를 비교하는 첫번째 방법과 같은 방식을 취하게 됩니다. 문자 하나하나를 확인해서 공백문자를 바꾼다는 의미를 갖게 됩니다.

2. [^\uAC00-\uD7AF\u1100-\u11FF\u3130-\u318F]+
두 번째 정규표현식은 마지막에 +를 더했습니다. 하나 이상에 매칭된다는 의미인데, 이렇게 하면 여러 개의 한글이 아닌 문자가 하나의 공백문자로 교체됩니다.

...
그리고 임의로 긴문자열을 만들어 실험했습니다.
한글, 영문 포함 2,000,000 자의 문자열에 대해 개별 char직접 확인과 두 개의 정규 표현식을 이용한 방법 등 세가지 방법을 사용해봤습니다.

걸린 시간은
개별 char  직접확인 :  138 ms
첫번째 정규표현식   :  308 ms
두번째 정규표현식   :  108 ms
입니다.

그렇군요. 두번째 정규표현식을 사용하는 것이 가장 짧은 시간 안에 결과를 반환해 주었습니다.

오늘의 교훈! 정규표현식을 적절하게 사용하자! 입니다. 핫핫핫.



Posted by 나야