정규표현식: REGEXP_LIKE·SUBSTR·INSTR·REPLACE·COUNT
문자 패턴을 검색·추출·위치 확인·치환·집계하는 Oracle 정규표현식 조건과 함수의 반환값·인자·패턴 규칙을 구분합니다.
핵심 요약
정규표현식은 문자열의 정확한 값이 아니라 패턴으로 검색·추출·치환할 때 사용합니다. Oracle SQL에서는 REGEXP_LIKE 조건과 REGEXP_SUBSTR, REGEXP_INSTR, REGEXP_REPLACE, REGEXP_COUNT 함수를 구분해야 합니다. 함수마다 반환값과 occurrence, match_param의 의미가 다릅니다.
주요 조건과 함수
| 이름 | 반환 | 용도 |
|---|---|---|
REGEXP_LIKE | TRUE/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}) |
| | OR | cat|dog |
Oracle에서는 POSIX 문자 클래스 [[:digit:]], [[:alpha:]], [[:alnum:]]도 사용할 수 있습니다.
REGEXP_LIKE
SELECT customer_id, email
FROM customer
WHERE REGEXP_LIKE(
email,
'^[[:alnum:]_.+-]+@[[:alnum:].-]+\.[[:alpha:]]{2,}$',
'i'
);
match_param의 대표 값:
i: 대소문자 구분 안 함c: 대소문자 구분m: 여러 줄에서^,$를 각 줄 기준으로 처리n: 점(.)이 줄바꿈도 일치하도록 처리
정규표현식만으로 실제 이메일 표준 전체를 완벽히 검증한다고 단정하지 않습니다. 예제는 패턴 함수의 동작을 이해하기 위한 것입니다.
REGEXP_SUBSTR와 occurrence
SELECT REGEXP_SUBSTR(
'A-10,B-20,C-30',
'[A-Z]-[0-9]+',
1,
2
) AS second_token
FROM dual;
개념 결과는 B-20입니다.
인자 순서:
source, pattern, position, occurrence, match_param, subexpr
subexpr를 사용하면 괄호로 묶은 하위 표현식 중 하나를 반환할 수 있습니다.
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
SELECT REGEXP_INSTR('ABC-123-XYZ', '[0-9]+') AS pos
FROM dual;
첫 숫자 패턴의 시작 위치를 반환합니다. return_option에 따라 일치 시작 위치 또는 일치 다음 위치를 반환할 수 있으므로 문제의 인자 위치를 확인합니다. 일치하지 않으면 0을 반환합니다.
REGEXP_REPLACE
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
SELECT REGEXP_COUNT('A1B22C333', '[0-9]+') AS number_groups
FROM dual;
연속된 숫자 덩어리는 각각 한 번 일치하므로 개념 결과는 3입니다. [0-9]로 바꾸면 숫자 한 문자씩 세어 결과가 달라집니다.
LIKE와의 차이
WHERE name LIKE 'KIM%'
LIKE는 %, _ 중심의 단순 패턴에 적합합니다. 정규표현식은 반복 횟수·선택·그룹·문자 클래스처럼 복잡한 규칙에 유리하지만 CPU 비용과 가독성 부담이 더 클 수 있습니다. 단순 접두어 검색을 불필요하게 정규표현식으로 바꾸지 않습니다.
문제 적용 순서
- 조건인지 문자열·숫자 반환 함수인지 구분합니다.
- 패턴의 Anchor, 반복자, 문자 집합을 왼쪽부터 해석합니다.
position,occurrence,match_param,subexpr의 위치를 확인합니다.- 일치하지 않을 때 NULL인지 0인지 함수별 반환 규칙을 구분합니다.
- Backreference가 패턴 안인지 치환 문자열 안인지 확인합니다.
복습 문제
REGEXP_LIKE와REGEXP_SUBSTR의 반환값 차이는 무엇인가?[0-9]+와[0-9]를 REGEXP_COUNT에 사용할 때 결과가 달라지는 이유는 무엇인가?- REGEXP_REPLACE의
\1이 의미하는 것을 설명하라.