CUBRID에서 정규표현식을 사용하기 위해서 REGEX 기능을 제공한다.
해당 식의 결과 값은 1 또는 0 으로 일치 또는 불일치로 표현된다.
자세한 내용은 다음의 링크를 참고 : https://www.cubrid.org/manual/ko/9.3.0/sql/function/condition_fn.html?highlight=regex#regexp-rlike
패턴이 일치하고 불일치하는지 찾아 낼수는 있으나 해당 패턴을 이용해서 치환을 하기에는 어렵다.
CUBRID에서는 Java SP(Function/Stored Procedure)기능이 있으므로 해당 기능을 활용해서 치환하는 펑션을 생성 하도록 하겠다.
일단 Java Funcation 용 간단한 java 를 짜서 컴파일한다.
클래스명은 RegexLib 로 만들고 메소드명은 ReplaceAll이라고 만든다.
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexLib { public static String ReplaceAll(String p_data, String p_regex, String p_replace) { Pattern ptrn = null; Matcher mtch = null; String rst = null; if(p_regex.isEmpty()) { ptrn = Pattern.compile(""); } else { ptrn = Pattern.compile(p_regex); } try { mtch = ptrn.matcher(p_data); rst = mtch.replaceAll(p_replace); } catch (Exception e) { return p_data; } return rst; } }
해당 코드를 컴파일 한다음 loadjava 유틸리티를 이용해서 필요한 데이터베이스에 class 파일을 load 후 사용하면 된다.
$ loadjava 데이터베이스명 RegexLib.class |
이제 해당 class를 Function으로 등록 해 보자. csql 또는 CM(cubrid manger)로 해당 데이터베이스에 접속한 후
CREATE FUNCTION RegexReplaceAll(p_data varchar, p_regex varchar, p_replace varchar) RETURN VARCHAR AS LANGUAGE JAVA NAME 'RegexLib.ReplaceAll(java.lang.String, java.lang.String, java.lang.String) return java.lang.String'; |
RegexReplaceAll(원문, 패턴, 패턴치환문자열) 로 만들었다.
이제 테스트를 해 보자.
csql> create table tst(a varchar(200)); Execute OK. (0.071368 sec) Committed. 1 command(s) successfully processed. csql> insert into tst values csql> ('2015 특수교육대상학생의 사회과 교수.학습 지도'), csql> ('2015 특수교육대상학생의 과학과 교수.학습지도'), csql> ('2015 장애학생 이해와 통합학급 운영'), csql> ('2015 치료교육 표시과목 변경 직무연수'), csql> ('2015 특수교육교원 역량강화'), csql> ('2015 장애학생 진로.직업교육'), csql> ('미래를 열어주는 장애학생의 진로_직업교육(전문과정)'), csql> ('2014-장애학생 이해와 통합학급 운영2'), csql> ('2014-장애학생 이해와 통합학급운영'), csql> ('2014-특수교육대상학생의 국어과 교수 · 학습지도') csql> ; 10 rows affected. (0.000916 sec) Committed. csql> select RegexReplaceAll(a, '^[[0-9년_-]|[ ]]+', '') from tst; === <Result of SELECT Command in Line 1> === RegexReplaceAll(a, '^[[0-9년_-]|[ ]]+', '') ====================== '특수교육대상학생의 사회과 교수.학습 지도' '특수교육대상학생의 과학과 교수.학습지도' '장애학생 이해와 통합학급 운영' '치료교육 표시과목 변경 직무연수' '특수교육교원 역량강화' '장애학생 진로.직업교육' '미래를 열어주는 장애학생의 진로_직업교육(전문과정)' '장애학생 이해와 통합학급 운영2' '장애학생 이해와 통합학급운영' '특수교육대상학생의 국어과 교수 · 학습지도' 10 rows selected. (0.011080 sec) Committed. |
해당 기능이 잘 동작함이 확인 되었다.
이처럼 CUBRID에서는 Java Sp를 이용하면 Java로 구현가능한 대부분을 만들 수 있다.