Twitter
- 아이폰 앨범을 보다보니 드는 생각. "10년쯤 지나서 이 녀석들이 다 죽고 나서 이 사진들을 보면 많이 쓸쓸하겠구나." http://flic.kr/p/8wW4GZ 2 days ago
- 우호적 집단에 새로 합류한 주도형 인간은 특별한 노력 없이는 그 조직에 받아들여지기 쉽지 않다. 하물며 주도형이 서로 충돌하는 것도 다반사. 주도적 주도형으로 조직안에서 살기가 쉽지 않은 것 같다. 2 days ago
- 아이팟에서 좋아하는 노래 목록을 플레이하니 댄스음악이 흘러나온다. 내 트윗을 보고 적절한 음악을 찾아주는건 불가능할까? (머 지금 선곡도 나쁘지않네~ 머시멜로 나오는 중) 2 days ago
- More updates...
Posting tweet...
Powered by Twitter Tools
카테고리
- Java (14)
- Ruby & Languages (4)
- Software & Developer (58)
- 고양이 이야기 (8)
- 그들의 이야기 (13)
- 깨달음으로 가는 길 (49)
- 제주 생활 (11)
-
최근 작성글
-
최근 덧글
- 김홍수 on 제주에서의 농구 생활
- 따지크 on NoSQL 정의와 사례 정리
- 문상철 on NoSQL 정의와 사례 정리
Java에서 한글을 정규표현식으로 찾기
문서를 읽어서 한글을 제외한 나머지 문자를 제거하기 위해 정규표현식을 사용했다. 이 과정에서 이해할 수 없는 경험들을 하게 되어 이곳에 정리한다.
처음에는 [^가-힣ㄱ-ㅎㅏ-ㅣ] 형태로 한글을 범위로 해서 찾았는데, 이렇게 하니 윈도우 기반 로컬 머신에서는 잘 동작하던 모듈이 linux 머신에서는 동작하지 않았다. 다른점을 살펴보니 linux 머신은 utf-8 기반이였고, 한글 정규표현식이 다르게 동작하는 것으로 보였다.
그래서 현재는 [^\\u3131-\\u318E\\uAC00-\\uD7A3] 와 같이 유니코드로 범위를 표시해서 한글 이외의 문자를 제거하고 있다. Java가 내부적으로 UTF-16을 사용하는 것으로 알고 있는데 정규표현식에서 서로 다르게 동작할 수 있다는 사실을 처음 알게 됐고, 이렇게 해결하긴 했지만 동작 원리를 정확히 이해하지는 못하고 있다.
(?u)[^가-힣ㄱ-ㅎㅏ-ㅣ] 이렇게 유티코드 옵션을 주고 실행해도 정상 동작하지 않는다. 찾아보니 UNICODE_CASE 일 때 범위 표현은 사용할 수 없다고 한다.
또 하나 고민은 (</?[bB][rR][ ]*/?>|</?[pP]/?>|</?[dD][iI][vV]/?>|</?[lL][iI]/?>|</?[tT][dD]/?>) 와 같은 형태로 html 태그 중에서 단락을 구분지어 주는 태그를 약속된 구분자로 치환하려는데 이때 2가지 문제가 발생한다.
첫번째는 분석하려는 본문이 길 때 치환에 시간이 많이 걸린다는 것이고, 또 하나는 가끔 StackOverflowError가 발생한다. 검색을 해보니 복잡한 정규표현식이나 분석하려는 대상이 길 때 발생할 수 있고 해결되지 않은 문제라고 한다. 정규표현식을 좀 더 명확하고 단순하게 개선하면 에러 발생을 줄일 수 있다는데 어떻게 하면 될까?
우선은 (?i)(</?br */?>|</?p/?>|</?div/?>|</?li/?>|</?td/?>) 대소문자 구분을 하지 않게 하고 필요 없는 표현을 제거했다. 실행 속도는 거의 변화가 없고 StackOverflowError가 줄어들지는 지켜봐야 한다.
(회사 동료분의 힌트로 다시 한번 수정. 현재는 (?i)</?(br *|p|div|li|td)/?> 형태로 더 간단해졌다.)