hre
Hangeul Regular Expression Library ¶1.1. 소개 ¶한글 정규표현식 라이브러리는 C 코드로 작성되었으며, 기존 ASCII 기반의 정규 표현식이 가지는 "멀티바이트 charset" 에 대한 잘못된 처리에 대해, 100% 완벽하게 처리합니다.
현재 이 프로젝트의 목표는 POSIX 정규 표현식을 준수하는 라이브러리를 만드는 것이 목표이다.
현재 v0.9.8 에 들어와서 Character class 를 제외한 POSIX "extended regular expressions" 를 모두 처리할 수 있으며, 점차적으로 POSIX "basic regular expressions" 또한 지원할 계획에 있다.
한글 정규표현식 라이브러리는 v0.9 버전대에 들어와서 한글의 특징대로 초성, 중성, 종성을 각자 처리할 수 있도록 함으로써, 한글을 좀 더 유연하게 표현할 수 있도록 구현하였으며, 이에 대한 자세한 내용은 아래의 "한글 정규 표현식" 에서 설명되어 있으니, 참조하기 바란다.
프로젝트 홈페이지는 http://kldp.net/projects/hre에 자리잡고 있다.
1.1.1. 특징 ¶
[:alnum:] [:alpha:] [:blank:] [:cntrl:] [:digit:] [:graph:] [:lower:] [:print:] [:space:] [:upper:] 1.1.1.1. 지원하는 platform 들 ¶현재 한글 정규표현식 라이브러리에서 성공적으로 테스트된 platform 정보는 아래와 같다.
(다른 Arch 혹은 OS, Lang 에서 성공적으로 테스트 완료를 하신 분은 아래에 추가해 주시면 대단히 감사하겠습니다. 코드 수정이 있었을 경우, 개발자들에게 메일로 패치를 보내주세요.)
1.1.1.2. 기존 (영어?) 정규 표현식의 문제점 ¶여기에서는 개발자가 왜 한글 정규 표현식을 만들게 되었는지에 대해서 짧게 이야기하려고 한다. 기존 grep 이나, egrep 등 다른 여타 정규 표현식을 사용할 경우, 대부분의 곳에서 한글을 제대로 처리하지 못한다는 사실을 확인할 수 있는데, 예를 들어,
$ grep "[가나다]"와 같은 문법이 있다고 가정을 했을 때, 문법적인 의미는 비록 "가", "나", "다" 중 매치되는 것을 선택하고자 하는 의도이지만, 실제 해볼 경우, "라" 도 인식이 된다. 왜냐하면, grep 에서는 한글을 지원하지 않기 때문에, "가", "나", "다" 의 첫바이트, 두번째 바이트에 대한 각각의 표현을 인식하기 때문이다. 즉 묶어서 한글 한 character 로 인식하지 못하는데, 이것은 1 바이트 이상을 사용하는 모든 국가에서 기존 정규식을 그대로 사용할 수 없는 이유중 하나이다. (일본어도 2 바이트이지만 자신들의 노력으로 이 문제를 해결한 듯 하다.) 이러한 문제점은 여러 정규식 대부분에서 발생하는데, "가*", "가+", "가?", "가{3,5}" 등등 대부분의 정규식 표현이 멀티 바이트 코드를 가지는 글자에 대해서는 처리하지 못하는게 현실이다. 이러한 문제점을 해결하기 위해서 이 정규 표현식 프로젝트를 시작하게 되었다. 현재 CVS 버전에서는 POSIX 의 "Basic regular expression" 이 원하는 기능에 대해서 모두 구현되어 있으며, 이제 각 BRE, ERE 를 조건에 맞게 배열하는 것만 처리하면, 곧 v1.0 이 될 것이다. 1.1.2. 단점 ¶
Testing in15... 입력 표현식 : [<ㄱ-ㅎ,ㅏ-ㅣ,ㄱ-ㅎ>] 입력 문자열 : aaaaa강aa Execution times (seconds) Process Syntax : 0.23 (1150%) usr 0.02 ( 0%) sys 0.25 (1253%) wall Apply form : 0.01 (50%) usr 0.00 ( 0%) sys 0.01 (50%) wall Form State : 0.13 (650%) usr 0.00 ( 0%) sys 0.13 (651%) wall TOTAL : 0.02 0.00 0.020~1 초가 소유되며, 유니코드의 경우, Testing in16... 입력 표현식 : [<????????????] 입력 문자열 : aaaaaaaa媛뷲aaaaaaaa Execution times (seconds) Process Syntax : 1.75 (8750%) usr 0.02 ( 0%) sys 1.77 (8868%) wall Apply form : 0.02 (100%) usr 0.00 ( 0%) sys 0.02 (100%) wall Form State : 0.74 (3700%) usr 0.00 ( 0%) sys 0.90 (4509%) wall TOTAL : 0.02 0.00 0.021~3 초가 소효된다. (최적화가 절실히 필요, HRE 사용자 문서의 한글 정규 표현식을 참고) 1.1.3. ERE 와 HRE 의 차이점 ¶POSIX "extended regular expressions" (이하 ERE) 와 HRE (한글 정규표현식 라이브러리) 에는 약간 차이가 존재한다. ERE 에 대해서는
![]()
HRE_OPTIONS_MODE (&option) = HRE_MODE_ERE; 1.2.1.1.1. C ¶
1.2.1.1.2. Python ¶
$ tar xvvzf pyhre-version.tar.gz $ cd pyhre-version $ python setup.py build $ python test.py $ python test_suite.py # python setup.py install
1.2.1.2. 자신의 application 에 추가하는 방법 ¶* 파일 추가 방법 (make install 를 통해서 /usr/local/ 에 설치하지 않을 경우)
#include <hre/hre.h>; make install 을 통해서 시스템 디렉토리에 설치하였으므로 위와 같이 사용할 수 있다.
1.2.1.3. 한글 정규 표현식 ¶KLDP 에서 한글 정규 표현식의 논의가 있었는데, 그 글은
![]() ![]()
[<초성,중성,종성>]
[ ~ ] 메타문자내 한글 표현은 반드시 '<' 와 '>' 사이에 와야 하며, '초성' 및 '중성', '종성'은 각각 다음과 같은 범위 표현을 할 수 있다.
예1) ㄱ-ㅎ 예2) ㅏ-ㅑ 예3) ㄱㄴㄷㅁ-ㅎ 예4) ㄱ-ㄷㅎㄷ또한 초성, 중성, 종성 중 범위 표현을 생략할 수 있다. 하지만 반드시 ',' 는 항상 붙여주어야 한다. 즉 한글 표현식에 대한 최소의 표현식은 <,,> 가 되어야 한다는 것이다. 이러한 조합을 통해서 표현할 수 있는 방법은 다음과 같은 방법이 있을 수 있겠다.
!!!주의!!! 한글 정규 표현식을 사용할 경우, 가장 문제시 될 수 있는 부분이 한글 정규식의 compile 시간인데,
<ㄱ-ㅎ,ㅏ-ㅣ,ㄱ-ㅎ> 와 같은 모든 한글을 처리하도록 설정한다면, 확장 완성형의 모든 글자인 11742 글자를
모두 처리해야 하기 때문에, 영문자를 처리하는 정규 표현식 라이브러리와 질적으로 시간차이가 날 수 밖에 없다.
그래서 사용자는 한글 정규 표현식을 사용할 때 최소한의 한글 (즉, 자신이 찾고하 하는 한글 범위의 가장 작은 것)
을 선택하여 performance 에 신경을 쓸 필요가 있다. 몰론 추후 버전에서는 이에 대한 최적화를 수행하도록
코드 개선을 할 것이다.
1.2.1.4. 사용자 함수 설명 ¶한글 정규 표현식 라이브러리에서 사용자가 이 라이브러리를 사용하기 위해서 알아야 하는 함수는 모두 3 개가 존재하는데, 각 함수의 설명을 하면 아래와 같다.
DFA : abc STR : babcd위와 같이 DFA 가, "abc" 이고, 문자열이 "babcd" 일 경우, hre_search () 함수는 4 를 반환한다. 즉 4 는 STR 의 'c' 를 가르킨다. 만약 match 되는 문자열을 찾을 수 없을 경우, -1 을 반환한다.
#include <hre/hre.h>
#define SUCCESS_EXIT_CODE 1 #define FATAL_EXIT_CODE (44 | 0x10000000) /* 정규 표현식 라이브러리의 phony main 함수. */ int main (argc, argv) int argc; char *argv[]; { int i; char *re = "[<ㄱ,ㅏ,><ㄷ,ㅏ,>]"; char *str = "다"; hre_t test; hre_option_t option; HRE_OPTIONS_MODE (&option) = HRE_MODE_ERE; /* 사용자가 입력한 정규식을 컴파일한다. */ if (!(test = hre_compile (re, option))) { printf ("정규 표현식에 오류가 존재합니다.\n"); return (FATAL_EXIT_CODE); } if (HDFA_ERRNO (test)) { fprintf (stderr, "ERROR NUMBER = %d\n", HDFA_ERRNO (test)); hre_free (test); } /* 찾기. 반환값이 -1 이 아닐 경우 패턴을 찾은 것이며, 반환값은 찾은 패턴의 끝을 가르키고 있다. */ i = hre_search (test, str); if (i == -1) { printf ("패턴과 맞는 문자열을 찾지 못하였습니다.\n"); return (FATAL_EXIT_CODE); } /* 메모리 릴리즈 */ hre_free (test); printf ("입력한 정규 표현식 : %s\n", re); printf ("비교한 문자열 : %s\n", str); printf ("찾은 위치 : %d\n", i); return (SUCCESS_EXIT_CODE); } 1.2.2.1. HRE CVS build 방법 ¶CVS 에 존재하는 최신의 패키지를 다운로드 받아 설치하는 부분까지 설명을 하였다.
$ mkdir temporary $ cd temporary우선 임의의 빈 디렉토리를 생성한다. $ CVSROOT=:ext:username@cvs.kldp.net:/cvsroot/hgre개발자일 경우, 위와 같이 설정하고, Anonymous 일 경우 아래와 같이 설정한다. $ CVSROOT=:pserver:anonymous@cvs.kldp.net:/cvsroot/hre $ cvq -q loginAnonymous 일 경우, 로그인 할 때 암호를 묻는데, 그냥 엔터치면 된다. 이후부터는 그대로 입력해도 무방할 것이다. $ cvs -q checkout -P hre $ cd hre $ aclocal $ autoheader $ automake -a위의 automake 를 실행하는 과정에서 오류가 발생할 수 있는데, 오류가 발생할 경우, 다시 한번 더 실행해 주면 된다. 오류가 발생하지 않을 때 까지 실행한다. $ autoconf $ ./configure $ make $ make check 1.2.2.2. HRE 처리 절차 ¶hre 에서 사용자 입력을 받아들여 DFA 테이블을 만드는 과정은 다음과 같다.
1.2.2.3. Debugging ¶입력된 정규 표현식은 b가*a 이다.
(gdb) b hre_form_state .... .... (gdb) p debug_state (p, sp) -------+-------+-------+-------+-------+-------+-------+------ 클래스 |길이 |*SList | SMRL |Empty |Shift |Sh.lhs |Sh.rhs -------+-------+-------+-------+-------+-------+-------+------ 3 | 1 | 14 0 | 0000 | 0 | 1 | 0xa1 | 1 2 | 1 | 11 0 | 0000 | 1 | 0 | | 1 | 1 | 4 0 | 0000 | 0 | 2 | a 0xb0 | 2 3 0 | 1 | 5 0 | 0000 | 0 | 1 | b | 1 -------+-------+-------+-------+-------+-------+-------+------ (gdb) 1.3. 다운로드 및 CVS ¶*
![]() ![]() 1.3.5. v0.9.6f ¶* 한글 범위 표현식 속도 개선 (<ㄱ-ㅎ,ㅏ-ㅣ,ㄱ-ㅎ> 의 완성형은 1 초, 유니코드는 3~4초가 소유.)
* 유니코드 및 완성형 테이블 정보 수정.
1.3.7. v0.9.6d ¶* autoconf 화된 HRE 버전이다. (make install 시 /usr/local/include/, /usr/local/lib/ 하위 디렉토리에 hre.h 파일과 libhre.a 파일이 각각 복사된다.)
1.3.11. v0.9.5 ¶* 버그가 없는 한 마지막 릴리즈가 될 것입니다. (제가 생각한 정규식 모양은 모두 갖추어졌기 때문에 마지막으로 생각한 것입니다.)
* 테스트 룰셋을 작성할 수 있는 기반 마련
* 예외 상황에 대한 오류 복구 기능 추가
* 정규 표현식 조합에서 오류 수정
1.3.14. v0.8 ¶* 인식할 수 있는 token 의 제한이 있음. 자세한 사항은 HRE 사용자 문서 를 참조 바람.
* 정규식이 완성형, 조합형, 유니코드로 이루어지더라도 정확한 DFA 테이블 생성.
* 정적 라이브러리 구성. (정규 표현식 라이브러리를 이용한 sample 파일 존재.)
2. 라이센스 및 개발자 정보 ¶Hangeul Regular Expression Copyright (C) 2001 Weongyo Jeong & Hyejin Soang This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Contact : Weongyo Jeong - weongyo@hotmail.com Hyejin Soang - redcloak@empal.com |
You will receive a legacy which will place you above want. |