정규표현식
1. 정규표현식이란
문자열 데이터의 간단한 패턴 및 복잡한 패턴을 검색 할 수 있는 방법으로 기존의 LIKE 연산의 한계를 뛰어넘는 막강한 검색 도구이다. 다양한 Meta Character 를 이용하여 복잡한 프로그래밍을 간단하게 해결 할 수 있으며 Data Validation, ETL(Extract, Transform, Load), Data Cleansing, Data Mining 등의 작업에서 유용하게 사용 될 수 있다. 제약 조건으로 테이블의 Data 유효성을 검증 할때도 사용 가능하다.
2. 정규표현식 방법
REGEXP_LIKE |
Like 연산과 유사하며 정규식 패턴을 검색 |
REGEXP_REPLACE |
정규식 패턴을 검색하여 대체 문자열로 변경 |
REGEXP_INSTR |
정규식 패턴을 검색하여 위치 반환 |
REGEXP_SUBSTR |
정규식 패턴을 검색하여 부분 문자 추출 |
REGEXP_COUNT |
정규식 패턴을 검색하여 발견된 횟수 반환 |
3. Meta Character
. |
지원되는 Character set에서 NULL 을 제외한 임의의 문자와 일치 |
+ |
한 번 이상 발생 수 일치 |
? |
0 또는 1번 발생 수 일치 |
* |
선행 하위식의 0번 이상 발생 수 일치 |
{m} |
선행 표현식의 정확히 m번 이상 발생 수 일치 |
{m , } |
선행 하위식과 최소 m번 이상 발생 수 일치 |
{m, n} |
선행 하위식의 최소 m번 이상, 최대 n번 이하 발생 수 일치 |
[ ... ] |
괄호 안의 리스트에 있는 임의의 단일 문자와 일치 |
| |
여러 대안 중 하나와 일치 (OR) |
( . . . ) |
괄호로 묶인 표현식을 한 단위로 취급함. 하위식은 리터럴의 문자열이나 연산자를 포함한 복잡한 표현식 가능 |
^ | 문자열 시작 부분과 일치 |
$ | 문자열 끝 부분과 일치 |
\ | 표현식에서 후속 메타 문자를 리터럴로 처리 (ESCAPE) |
\n | 괄호 안의 그룹화된 n번쨰(1~9) 선행 하위식과 일치. 괄호는 표현식이 기억되도록 만들고 backreference에서 표현식 참조 |
/d | 숫자 문자 |
[ :class: ] | 지정된 POSIX 문자 클래스에 속한 임의의 문자와 일치 [:alpha:] 알파벳 문자 [:digit:] 숫자 [:lower:] 소문자 알파벳 문자 [:upper:] 대문자 알파벳 문자 [:alnum:] 알파벳/숫자 [:space:] 공백 문자 [:punct:] 구두점 기호 [:cntrl:] 컨트롤 문자 [:print:] 출력 가능한 문자 |
[^:class:] | 괄호 안의 리스트에 없는 임의의 단일 문자와 일치 |
Meta Character를 이용하여 정규식 사용이 가능하다.
4. 정규표현식 활용 예제
REGEXP_REPLACE
http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions130.htm
1 2 3 4 5 | SELECT REGEXP_REPLACE(phone_number, '([[:digit:]]{3})\.([[:digit:]]{3})\.([[:digit:]]{4})', '(\1) \2-\3') "REGEXP_REPLACE" FROM employees; | cs |
1 2 3 4 5 6 7 | REGEXP_REPLACE -------------------------------------------------------------------------------- (515) 123-4567 (515) 123-4568 (515) 123-4569 (590) 423-4567 . . . | cs |
REGEXP_INSTR
http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions129.htm#SQLRF06300
1 2 3 4 5 | SELECT SELECT REGEXP_INSTR('500 Oracle Parkway, Redwood Shores, CA', '[^ ]+', 1, 6) "REGEXP_INSTR" FROM DUAL; | cs |
1 2 3 | REGEXP_INSTR ------------ 37 | cs |
1 2 3 4 | SELECT REGEXP_INSTR('500 Oracle Parkway, Redwood Shores, CA', '[s|r|p][[:alpha:]]{6}', 3, 2, 1, 'i') "REGEXP_INSTR" FROM DUAL; | cs |
1 2 3 | REGEXP_INSTR ------------ 28 | cs |
REGEXP_SUBSTR
http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions131.htm
1 2 3 4 | SELECT REGEXP_SUBSTR('500 Oracle Parkway, Redwood Shores, CA', ',[^,]+,') "REGEXPR_SUBSTR" FROM DUAL; | cs |
1 2 3 | REGEXPR_SUBSTR ----------------- , Redwood Shores, | cs |
1 2 3 4 | SELECT REGEXP_SUBSTR('http://www.oracle.com/products', 'http://([[:alnum:]]+\.?){3,4}/?') "REGEXP_SUBSTR" FROM DUAL; | cs |
1 2 3 | REGEXP_SUBSTR ---------------------- http://www.oracle.com/ | cs |