Post

[SQL] 정규 표현식

[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;
  • 결과

. (dot) 예제

| (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;
  • 결과

| (or) 예제

\ (backslash)

\는 다음 문자를 일반 문자로 취급한다.

예제


  • 쿼리
1
2
3
SELECT REGEXP_SUBSTR('a|b', 'a|b') AS C1
     , REGEXP_SUBSTR('a|b', 'a\|b') AS C2
  FROM DUAL;
  • 결과

\ (backslash) 예제

^ (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;
  • 결과

'^ (carrot) 예제

$ (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;
  • 결과

$ (dollar) 예제

수량사

수량사는 선행 표현식의 일치 횟수를 지정한다. 패턴을 최대로 일치시키는 탐욕적 방식으로 동작한다. 종류는 다음과 같으며, 예제는 생략하겠다.

  • ?

    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;
  • 결과

\n 예제

문자리스트

문자 리스트는 문자를 대괄호로 묶은 표현식이다. 문자 리스트 중 한 문자만 일치하면 패턴이 일치한 것으로 처리된다. 문자 리스트에서 하이픈은 범위 연산자로 동작한다. 종류는 다음과 같으며 예제는 생략하겠다.

  • [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 형식으로 다수의 옵션을 함께 지정할 수도 있다.)

예제


예제에 사용되는 릴레이션은 아래와 같다.

EMP 릴레이션

EMP 릴레이션
  • 쿼리
1
2
3
4
SELECT A.ENAME
     , A.JOB
  FROM EMP A
 WHERE REGEXP_LIKE(ENAME, '^A'); 
  • 결과

REGEXP_LIKE 예제

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).

예제


예제에 사용되는 릴레이션은 아래와 같다.

EMP 릴레이션

EMP 릴레이션
  • 쿼리
1
2
3
SELECT A.ENAME
     , REGEXP_REPLACE(A.SAL, '([[{:digit:]]{3})') 
  FROM EMP A;
  • 결과

REGEXP_REPLACE 예제

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_SUBSTR 예제

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_INSTR 예제

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;
  • 결과

REGEXP_COUNT 예제


읽어주셔서 감사합니다. 😊

Reference
SQL 전문가 가이드 - Kdata 한국데이터산업진흥원

This post is licensed under CC BY 4.0 by the author.