Background Image
조회 수 12742 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
CUBRID에서는 정규표현식을 사용하기 위홰서 RLIKE 와 REGEXP를 지원한다.

매뉴얼 링크는 다음과 같다. 
http://www.cubrid.org/manual/ko/9.2.0/sql/function/condition_fn.html#regexp-rlike

REGEXPRLIKE는 동일하며, 정규 표현식을 이용한 패턴을 매칭하기 위해 사용된다. 정규 표현식은 복잡한 검색 패턴을 표현하는 강력한 방법이다. CUBRID는 Henry Spencer가 구현한 정규 표현식을 사용하며, 이는 POSIX 1003.2 표준을 따른다. 이 페이지는 정규 표현식에 대한 세부 사항을 설명하지는 않으므로, 정규 표현식에 대한 자세한 사항은 Henry Spencer의 regex(7)을 참고한다.

다음은 정규 표현식 패턴의 일부이다.

  • "."은 문자 하나와 매칭된다(줄바꿈 문자(new line)와 캐리지 리턴 문자(carriage return)를 포함).
  • "[...]"은 대괄호 안의 문자 중 하나와 매칭된다. 예를 들어, "[abc]"는 "a", "b" 또는 "c"와 매칭된다. 문자의 범위를 나타내려면 대시(-)를 사용한다. "[a-z]"은 임의의 알파벳 문자 하나와 매칭되고, "[0-9]"는 임의의 숫자 하나와 매칭된다.
  • "*"은 앞의 문자 또는 문자열이 0번 이상 연속으로 나열된 문자열과 매칭된다. 예를 들어, "xabc*"는 "xab", "xabc", "xabcc", "xabcxabc" 등과 매칭되며, "[0-9][0-9]*"는 어떤 숫자와도 매칭된다. 그리고 ".*"은 모든 문자열과 매칭된다.
  • "n", "t", "r", ""의 특수 문자를 매칭하기 위해서는 시스템 파라미터 no_backslash_escapes (기본값: yes)를 no로 설정하여 백슬래시()를 이스케이프 문자로 허용해야 한다. no_backslash_escapes에 대한 자세한 설명은 특수 문자 이스케이프를 참고한다.

REGEXP와 LIKE의 차이는 다음과 같다.

  • LIKE 절은 입력값 전체가 패턴과 매칭되어야 성공한다.
  • REGEXP는 입력값의 일부가 패턴과 매칭되면 성공한다. REGEXP에서 전체 값에 대한 패턴 매칭을 하려면, 패턴의 시작에는 "^"을, 끝에는 "$"을 사용해야 한다.
  • LIKE 절의 패턴은 대소문자를 구분하지만 REGEXP에서 정규 표현식의 패턴은 대소문자를 구분하지 않는다. 대소문자를 구분하려면 REGEXP BINARY 구문을 사용해야 한다.
  • REGEXPREGEXP BINARY는 피연산자의 콜레이션을 고려하지 않고 ASCII 인코딩으로 동작한다.
 
하지반 실제 사용하기 위한 예제가 충분하지 않고 실제 구현하다보면 안되는 부분이 약간 있어서 
주의할 점에 대한 설명과 자주 사용하는 예를 들어서 내용을 전개 하고자 한다.

1) REGEXP와 LIKE의 차이 중 가장 큰점은 REGEXP에서 정규 표현식의 패턴은 대소문자를 구분이 되지 않는다.
    따라서 
REGEXP 사용 시 REGEXP BINARY 로 사용하는 것이 정확한 결과를 볼 수 있다.
2) cubrid.conf 의 no_backslash_escapes 기본 값이 yes이므로 백슬래시()를 이스케이프 문자가 디폴트로 사용되지 않는다.
3) 정규 표현식 사용 시 w 영숫자(영문 및 숫자)를 대표하는 알리아스는 
   테스트 결과 작동 하지 않으므로 [0-9a-zA-Z]로 표현 해야 할 것이다.
4) 정규 표현식 사용 시 d 숫자를 대표하는 알리아스도
   테스트 결과 작동 하지 않으므로 [0-9]로 표현 해야 할 것이다.
5) 정규 표현식 사용 시 s 공백를 대표하는 알리아스도
   테스트 결과 작동 하지 않으므로 [ ]로 표현 해야 할 것이다.
6) 정규식 결과는 일치 시 1 불일치 시 0 NULL 일 때 NULL 이므로 NULL 까지 확인 하기 위해서는 
   NVL()함수를 이용하자.
7) 정확한 검사를 위해서 ()(소괄호)를 이용해서 명확하게 구분하자.
   ex) SELECT ( '123' REGEXP BINARY '^[0-9]+' ) -- 예제는 숫자로 시작하는 문자열을 확인
8) 단일 조건으로 사용 할 때 INDEX 활용이 되지 않음에 유의 하자.

다음은 자주 사용되는 예제이다.

1) 이메일 체크
   : 영숫자로 시작하며 2번 문자부터는 영숫자 및 특수문자 `.`, `-`, `_` 를 포함 할 수 있고 
     @ 뒤에는 영숫자로 시작하며 두번째 문자부터는 특수문자 `-`, `_`를 포함 할 수 있고
     . 뒤에 영숫자로 시작하며 두번째 문자부터는 특수문자 `-`, `_`를 포함 할 수 있으며 1또는 2회 반복 가능.
SELECT 
email,
NVL(email REGEXP BINARY '(^[0-9a-zA-Z])([0-9a-zA-Z]|[0-9a-zA-Z._-])+([0-9a-zA-Z]@[0-9a-zA-Z][0-9a-zA-Z_-]+(.[0-9a-zA-Z]+[0-9a-zA-Z_-]){1,2})$', 0) AS email_chk
FROM 테이블

2) 유효 날짜 체크
   : 1900년 부터 시작하여 20xx년 까지부터는 숫자
    월은 0으로 시작하며 두번째 문자는 0-9까지 및 1로 시작하며 0부터 2까지
    일은 0 또는 2로 시작하여 0-9까지 및 3으로 시작하여 0-1까지

SELECT 
birthday,
NVL(birthday REGEXP '^[1-2][9|0][0-9]{2}(0[1-9])|(1[0-2])(([0-2][0-9])|(3[0-1]))', 0) AS birthday_chk
FROM 테이블

3) 일반 전화 번호 체크
  : 070을 포함한 지역번호로 시작하며 중간번호가 3또는 4자리
    마지막 자리는 4자리의 숫자

SELECT 
phone,
NVL(phone REGEXP '^(070|02|031|032|033|041|042|043|051|052|053|054|055|061|062|063|064)[0-9]{3,4}[0-9]{4}$', 0) AS phone_chk
FROM 테이블

4) 휴대전화 번호 체크
   : 앞의 4자리가 010x로 시작시 뒤는 모두 4자리
     앞의 4자리가 과거 3G번호 대 일 때에는 뒤의 자리는 7 또는 8자리

SELECT 
mobile,
NVL(mobile REGEXP '(^010[0-9]{4})[0-9]{4}|((^01[1|6|7|8|9][0-9]{3,4})[0-9]{4})$', 0) AS mobile_chk
FROM 테이블

5) IP 번호 체크
   : 0~255.0~255.0~255.0~255

SELECT 
ip,
NVL(ip REGEXP '^([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5])).([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5])).([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5])).([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))$', 0) AS ip_chk
FROM 테이블

위의 예제와 같이 사용 할 수 있으나 날짜 체크의 경우 윤년일 경우에만 존재하는 2월 29일이 나올 수도 있으며 
예제의 정규식은 완벽하지 않으므로 사용 시 충분한 테스트를 하여 확인 해 보아야 하겠다. 



List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
106 기타 데이터베이스 생성하기 file 남재우 2011.03.07 29100
105 Linux 복제 따라하기 admin 2008.11.21 29096
104 Java QuantumDB Eclipse Plugin을 사용하여 CUBRID연동하기 2 cubebridge 2009.10.06 28921
103 튜닝 [질의튜닝]order by desc가 인덱스 타게 하려면 admin 2011.07.14 28473
102 Linux CUBRID DB와 Broker 분리방안 정만영 2010.04.28 28412
101 기타 스칼라 서브쿼리 사용 가이드 웁쓰 2009.12.31 28274
100 기타 조인 방법(Join Method) 설명 file 웁쓰 2009.12.31 27994
99 Windows CUBRID2008R2.0 Windows BACKUP 자동화 설정하기 정만영 2009.08.17 27942
98 Install CUBRID R2.0 ISV(Independent Software Vendor)설치방법 file cubebridge 2009.11.20 27921
97 Linux CUBRID Tutorial (Unix/Linux) 정만영 2009.08.17 27885
96 Java JavaSP SampleCode(Pivot기능) cubebridge 2009.07.28 27553
95 Windows 윈도우즈 환경에서 배치화일을 이용하여 백업 또는 데이터베이스 정리 수행하기 남재우 2010.03.03 27486
94 Java CUBRID JDBC에서 유니코드 사용하기 1 손승일 2009.08.15 27434
93 Install CUBRID2008 R2.1 업그레이드시 serial 관련 문제 해결 방법 남재우 2010.01.28 27348
92 Windows CUBRID2008 R2.0 Tutorial (Windows) cubebridge 2009.08.17 27340
91 Windows eclipse에서 python 및 CUBRID broker_log_top 사용하기 cubebridge 2009.07.28 27272
90 Linux CUBRID2008R1.x to 2.0 마이그레이션 가이드 (32bit 기준) 정만영 2009.08.17 27205
89 ODBC/OLEDB VB에서 CUBRID ODBC/OLEDB 사용하는 방법 및 샘플코드. file seongjoon 2012.06.30 26926
88 Linux 리소스를 제한(limits.conf) 하여 DB서버를 관리하자 1 주현 2015.12.31 26612
87 기타 csql(SQL 실행기) 사용법 1 admin 2008.11.21 26557
Board Pagination Prev 1 2 3 4 5 6 7 8 9 Next
/ 9

Contact Cubrid

대표전화 070-4077-2110 / 기술문의 070-4077-2113 / 영업문의 070-4077-2112 / Email. contact_at_cubrid.com
Contact Sales