현재 선택한 SQL 과정

SQLD 이론 학습

이론 목록으로 돌아가기

정규표현식: REGEXP_LIKE·SUBSTR·INSTR·REPLACE·COUNT

문자 패턴을 검색·추출·위치 확인·치환·집계하는 Oracle 정규표현식 조건과 함수의 반환값·인자·패턴 규칙을 구분합니다.

예상 읽기 5

핵심 요약

정규표현식은 문자열의 정확한 값이 아니라 패턴으로 검색·추출·치환할 때 사용합니다. Oracle SQL에서는 REGEXP_LIKE 조건과 REGEXP_SUBSTR, REGEXP_INSTR, REGEXP_REPLACE, REGEXP_COUNT 함수를 구분해야 합니다. 함수마다 반환값과 occurrence, match_param의 의미가 다릅니다.

주요 조건과 함수

이름반환용도
REGEXP_LIKETRUE/FALSE 조건패턴과 일치하는 행 검색
REGEXP_SUBSTR일치 문자열패턴에 맞는 부분 문자열 추출
REGEXP_INSTR위치 번호일치 시작 또는 끝 위치 반환
REGEXP_REPLACE치환된 문자열일치 부분을 다른 문자열로 변경
REGEXP_COUNT횟수패턴 출현 횟수 계산

기본 패턴

패턴의미
^문자열 시작^A
$문자열 끝Z$
.임의 한 문자A.C
*앞 요소 0회 이상AB*
+앞 요소 1회 이상[0-9]+
?앞 요소 0회 또는 1회colou?r
{m,n}m~n회 반복[0-9]{2,4}
[]문자 집합[A-Z]
[^]제외 집합[^0-9]
()하위 표현식([0-9]{3})
|ORcat|dog

Oracle에서는 POSIX 문자 클래스 [[:digit:]], [[:alpha:]], [[:alnum:]]도 사용할 수 있습니다.

REGEXP_LIKE

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
SELECT customer_id, email
FROM   customer
WHERE  REGEXP_LIKE(
         email,
         '^[[:alnum:]_.+-]+@[[:alnum:].-]+\.[[:alpha:]]{2,}$',
         'i'
       );

match_param의 대표 값:

  • i: 대소문자 구분 안 함
  • c: 대소문자 구분
  • m: 여러 줄에서 ^, $를 각 줄 기준으로 처리
  • n: 점(.)이 줄바꿈도 일치하도록 처리

정규표현식만으로 실제 이메일 표준 전체를 완벽히 검증한다고 단정하지 않습니다. 예제는 패턴 함수의 동작을 이해하기 위한 것입니다.

REGEXP_SUBSTR와 occurrence

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
SELECT REGEXP_SUBSTR(
         'A-10,B-20,C-30',
         '[A-Z]-[0-9]+',
         1,
         2
       ) AS second_token
FROM dual;

개념 결과는 B-20입니다.

인자 순서:

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
source, pattern, position, occurrence, match_param, subexpr

subexpr를 사용하면 괄호로 묶은 하위 표현식 중 하나를 반환할 수 있습니다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
SELECT REGEXP_SUBSTR(
         '2026-07-28',
         '([0-9]{4})-([0-9]{2})-([0-9]{2})',
         1, 1, NULL, 2
       ) AS month_value
FROM dual;

개념 결과는 07입니다.

REGEXP_INSTR

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
SELECT REGEXP_INSTR('ABC-123-XYZ', '[0-9]+') AS pos
FROM dual;

첫 숫자 패턴의 시작 위치를 반환합니다. return_option에 따라 일치 시작 위치 또는 일치 다음 위치를 반환할 수 있으므로 문제의 인자 위치를 확인합니다. 일치하지 않으면 0을 반환합니다.

REGEXP_REPLACE

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
SELECT REGEXP_REPLACE(
         '010.1234.5678',
         '([0-9]{3})\.([0-9]{4})\.([0-9]{4})',
         '\1-\2-\3'
       ) AS phone
FROM dual;

개념 결과는 010-1234-5678입니다. 치환 문자열의 \1, \2, \3은 괄호 하위 표현식을 다시 사용한 Backreference입니다.

occurrence = 0이면 모든 일치 항목을 바꾸고, 양수이면 해당 번째 일치만 바꿉니다.

REGEXP_COUNT

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
SELECT REGEXP_COUNT('A1B22C333', '[0-9]+') AS number_groups
FROM dual;

연속된 숫자 덩어리는 각각 한 번 일치하므로 개념 결과는 3입니다. [0-9]로 바꾸면 숫자 한 문자씩 세어 결과가 달라집니다.

LIKE와의 차이

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
WHERE name LIKE 'KIM%'

LIKE%, _ 중심의 단순 패턴에 적합합니다. 정규표현식은 반복 횟수·선택·그룹·문자 클래스처럼 복잡한 규칙에 유리하지만 CPU 비용과 가독성 부담이 더 클 수 있습니다. 단순 접두어 검색을 불필요하게 정규표현식으로 바꾸지 않습니다.

문제 적용 순서

  1. 조건인지 문자열·숫자 반환 함수인지 구분합니다.
  2. 패턴의 Anchor, 반복자, 문자 집합을 왼쪽부터 해석합니다.
  3. position, occurrence, match_param, subexpr의 위치를 확인합니다.
  4. 일치하지 않을 때 NULL인지 0인지 함수별 반환 규칙을 구분합니다.
  5. Backreference가 패턴 안인지 치환 문자열 안인지 확인합니다.

복습 문제

  1. REGEXP_LIKEREGEXP_SUBSTR의 반환값 차이는 무엇인가?
  2. [0-9]+[0-9]를 REGEXP_COUNT에 사용할 때 결과가 달라지는 이유는 무엇인가?
  3. REGEXP_REPLACE의 \1이 의미하는 것을 설명하라.