JAVA

[Regular Expression]정규식 관련 (한글 정규식 찾기) + EditPlus사용법

saltdoll 2010. 11. 2. 15:50
반응형

한국에서 프로그램을 하다보면, 한글로 된 리소스(문자)들을 영문으로 바꾸거나, 

입력한 글자중에 한글이 있는지 찾는 로직이 필요할때가 있습니다. 

정규식(Regular Expression)을 이용한 방법을 사용하면, 빠르게 찾을 수 있고 유용합니다. 

(정규표현식 설명: https://wikidocs.net/46744)



정규식 관련 설명 사이트 

http://kio.zc.bz/Lecture/regexp.html

/[\u3131-\u3163\uac00-\ud7a3]/g
  •  blah .
코드 번호> 3131:ㄱ 3163:ㅣ ac00:가 d7a3:힣 (javascript, java)

한글 관련 핵심요소


[한글만 찾기] ==> [가-힣ㄱ-ㅎㅏ-ㅣ]  ==> [\\u3131-\\u318E\\uAC00-\\uD7A3]

[한글만 빼고] ==> [^가-힣ㄱ-ㅎㅏ-ㅣ]



[펌] 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)/?> 형태로 더 간단해졌다.)


출처: http://fantazic.com/archives/513



유니코드(UTF-8)한글 코드표, 한글코드 범위{AC00-D7AF}

출처 : http://sexy.pe.kr/tc/113?category=2


전체 코드표: http://titus.uni-frankfurt.de/unicode/unitestx.htm

정규식을 이용하다보니 한글부분 매치시킬때 한글코드 범위가 유용하게 활용되더라구요.

필요하신분 참고하세요~



Editplus에서 사용한 하기

여러 파일 찾기 >>

찾을 말(I): [가-힝ㄱ-ㅎ ㅏ-l]

Editplus 찾기 기능

반응형
도움이 되셨다면 하트모양의 "♡ 공감"을 눌러주시면 큰 격려가 됩니다.
(로그인하지 않으셔도 가능)