[SQL] 정규 표현식
개요
정규 표현식은 문자열의 규칙을 표현하는 검색 패턴으로 주로 문자열 검색과 치환에 사용된다.
POSIX 연산자
정규 표현식의 POSIX 연산자(POSIX operator)를 살펴보자.
. (dot)
.은 모든 문자와 일치(newline 제외)한 것을 찾을 때 사용한다.
예제
- 쿼리
1
2
3
4
5
SELECT REGEXP_SUBSTR('aab', 'a.b') AS C1
, REGEXP_SUBSTR('abb', 'a.b') AS C2
, REGEXP_SUBSTR('acb', 'a.b') AS C3
, REGEXP_SUBSTR('adc', 'a.b') AS C4
FROM DUAL;
- 결과
| (or)
|는 대체 문자를 구분한다.
예제
- 쿼리
1
2
3
4
5
6
7
8
9
SELECT REGEXP_SUBSTR('a', 'a|b') AS C1
, REGEXP_SUBSTR('b', 'a|b') AS C2
, REGEXP_SUBSTR('c', 'a|b') AS C3
, REGEXP_SUBSTR('ab', 'ab|cd') AS C4
, REGEXP_SUBSTR('cd', 'ab|cd') AS C5
, REGEXP_SUBSTR('bc', 'ab|cd') AS C6
, REGEXP_SUBSTR('aa', 'a|aa') AS C7
, REGEXP_SUBSTR('aa', 'aa|a') AS C8
FROM DUAL;
- 결과
\ (backslash)
\는 다음 문자를 일반 문자로 취급한다.
예제
- 쿼리
1
2
3
SELECT REGEXP_SUBSTR('a|b', 'a|b') AS C1
, REGEXP_SUBSTR('a|b', 'a\|b') AS C2
FROM DUAL;
- 결과
^ (carrot)
^는 검색 패턴의 문자열 시작점을 표현할 때 사용한다.
예제
- 쿼리
1
2
3
SELECT REGEXP_SUBSTR('ab' || CHR(10) || 'cd', '^.', 1, 1) AS C1
, REGEXP_SUBSTR('ab' || CHR(10) || 'cd', '^.', 1, 2) AS C2
FROM DUAL;
- 결과
$ (dollar)
$는 검색 패턴의 문자열 끝을 표현할 때 사용한다.
예제
- 쿼리
1
2
3
SELECT REGEXP_SUBSTR('ab' || CHR(10) || 'cd', '.$', 1, 1) AS C3
, REGEXP_SUBSTR('ab' || CHR(10) || 'cd', '.$', 1, 2) AS C4
FROM DUAL;
- 결과
수량사
수량사는 선행 표현식의 일치 횟수를 지정한다. 패턴을 최대로 일치시키는 탐욕적 방식으로 동작한다. 종류는 다음과 같으며, 예제는 생략하겠다.
- ?
0회 또는 1회 일치
- *
0회 또는 그 이상의 횟수로 일치
- +
1회 또는 그 이상의 횟수로 일치
- {m}
m회 일치
- {m,}
최소 m회 일치
- {,m}
최대 m회 일치
- {m,n}
최소 m회, 최대 n회 일치
\n
\n은 n번째 서브 표현식과 일치, n은 1에서 9 사이의 정수
예제
- 쿼리
1
2
3
4
5
6
7
SELECT REGEXP_SUBSTR('abxab', '(ab|cd)x\1') AS C1
, REGEXP_SUBSTR('cdxcd', '(ab|cd)x\1') AS C2
, REGEXP_SUBSTR('abxef', '(ab|cd)x\1') AS C3
, REGEXP_SUBSTR('ababab', '(.*)\1+') AS C4
, REGEXP_SUBSTR('abcabc', '(.*)\1+') AS C5
, REGEXP_SUBSTR('abcabd', '(.*)\1+') AS C6
FROM DUAL;
- 결과
문자리스트
문자 리스트는 문자를 대괄호로 묶은 표현식이다. 문자 리스트 중 한 문자만 일치하면 패턴이 일치한 것으로 처리된다. 문자 리스트에서 하이픈은 범위 연산자로 동작한다. 종류는 다음과 같으며 예제는 생략하겠다.
- [char…]
문자 리스트 중 한 문자와 일치
- [^char…]
문자 리스트에 포함되지 않은 한 문자와 일치
- [:digit:]
숫자를 의미하며 [0-9]와 같다.
- [:lower:]
소문자를 의미하며 [a-z]와 같다.
- [:upper:]
대문자를 의미하며 [A-Z]와 같다.
- [:alpha:]
영문자를 의미하며 [a-zA-Z]와 같다.
- [:alnum:]
영문자와 숫자를 의미하며 [0-9a-zA-Z]와 같다.
- [:xdigit]
16진수를 의미하며 [0-9a-fA-F]와 같다.
- [:punct:]
구두점 기호를 의미하며 [^[:alnum:][:cntrl:]]와 같다.
- [:blank:]
공백 문자를 의미한다.
- [:space:]
공간 문자(space, enter, tab)를 의미한다.
PERL 정규 표현식 연산자
정규 표현식의 PERL 정규 표현식 연산자(PERL regular expression operator)를 살펴보자. 다음의 PERL 정규 표현식 연산자는 POSIX 문자 클래스와 수량사와 유사하게 동작한다. 내용은 다음과 같으며, 예제는 생략하겠다.
- \d
숫자를 의미하며 [[:digit:]]와 동일하다.
- \D
숫자가 아닌 모든 문자를 의미하며 [^[:digit:]]와 동일하다.
- \w
숫자와 영문자(underbar 포함)를 의미하며 [[:alnum:]_]와 동일하다.
- \W
숫자와 영문자가 아닌 모든 문자(underbar 제외)를 의미하며 [^[:alnum:]_]와 동일하다.
- \s
공백문자를 의미하며 [[:space:]]와 동일하다.
- \S
공백 문자가 아닌 모든 문자를 의미하며 [^[:space:]]
- ??
0회 또는 1회 일치
- *?
0회 또는 그 이상의 횟수로 일치
- +?
1회 또는 그 이상의 횟수로 일치
- {m}?
m회 일치
- {m,}?
최소 m회 일치
- {,m}?
최대 m회 일치
- {m,n}?
최소 m회, 최대 n회 일치
정규 표현식 함수
REGEXP_LIKE 조건
REGEXP_LIKE 조건은 source_char가 pattern과 일치하면 TRUE를, 일치하지 않으면 FALSE를 반환한다.
사용법
1
REGEXP_LIKE(source_char, pattern [, match_param])
- source_char는 검색 문자열을 지정한다.
- pattern은 검색 패턴을 지정한다.
- match_param은 일치 옵션을 지정한다(i: 대소문자 무시, c: 대소문자 구분, n: dot(.)를 개행 문자와 일치, m: 다중 행 모드, x: 검색 패턴의 공백 문자를 무시, 기본값은 c다. icnmx 형식으로 다수의 옵션을 함께 지정할 수도 있다.)
예제
예제에 사용되는 릴레이션은 아래와 같다.
- 쿼리
1
2
3
4
SELECT A.ENAME
, A.JOB
FROM EMP A
WHERE REGEXP_LIKE(ENAME, '^A');
- 결과
REGEXP_REPLACE 함수
REGEXP_REPLACE 함수는 source_char에서 일치한 pattern을 replace_string으로 변경한 문자 값을 반환한다.
사용법
1
REGEXP_REPLACE(source_char, pattern [, replace_string [, position [, occurrence [, match_param]]]])
- replace_string은 변경 문자열을 지정한다.
- position은 검색 시작 위치를 지정한다(기본값은 1).
- occurrence는 패턴 일치 횟수를 지정한다(기본값은 1).
예제
예제에 사용되는 릴레이션은 아래와 같다.
- 쿼리
1
2
3
SELECT A.ENAME
, REGEXP_REPLACE(A.SAL, '([[{:digit:]]{3})')
FROM EMP A;
- 결과
REGEXP_SUBSTR 함수
REGEXP_SUBSTR 함수는 source_char에서 일치한 pattern을 반환한다.
사용법
1
REGEXP_SUBSTR(source_char, pattern [, position [, occurrence [, match_param [, subexpr]]]])
- subexpr은 서브 표현식을 지정한다.(0은 전체 패턴, 1 이상은 서브 표현식, 기본값은 0)
예제
- 쿼리
1
2
SELECT REGEXP_SUBSTR('http://www.example.com/products', 'http://([[:alnum:]]+\.?){3,4}/?') AS C1
FROM DUAL;
- 결과
REGEXP_INSTR 함수
REGEXP_INSTR 함수는 source_char에서 일치한 pattern의 시작 위치를 정수로 반환한다.
사용법
1
REGEXP_INSTR(source_char, pattern [, position [, occurrence [, return_opt [, match_param [, subexpr]]]]])
- return_opt은 반환 옵션을 지정한다.(0은 시작 위치, 1은 다음 위치, 기본값은 0)
예제
- 쿼리
1
2
SELECT REGEXP_INSTR('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 1) AS C1
FROM DUAL;
- 결과
REGEXP_COUNT 함수
REGEXP_COUNT 함수는 source_char에서 일치한 pattern의 횟수를 반환한다.
사용법
1
REGEXP_COUNT(source_char, pattern [, position [, match_param ]])
예제
- 쿼리
1
2
SELECT REGEXP_COUNT('123123123123123', '123', 1) AS C1
FROM DUAL;
- 결과
읽어주셔서 감사합니다. 😊
Reference
SQL 전문가 가이드 - Kdata 한국데이터산업진흥원











