10. 정규표현식 (2024 개정 신규)#
2024년 SQLD 개정으로 추가된 항목. ★ = 시험 빈출
1. 정규표현식 기본 문법#
메타 문자#
| 문자 | 의미 |
|---|---|
\d |
숫자 (0-9) |
\D |
숫자가 아닌 것 |
\s |
공백 |
\S |
공백이 아닌 것 |
\w |
단어 (알파벳, 숫자, _) |
\W |
단어가 아닌 것 |
\t |
Tab |
\n |
줄바꿈 |
^ |
시작 글자 |
$ |
마지막 글자 |
. |
한 글자 (엔터 제외) |
\ |
메타문자 이스케이프 |
문자 클래스 (대괄호)#
| 패턴 | 의미 |
|---|---|
[ab] |
a 또는 b 한 글자 |
[^ab] |
a, b를 제외한 한 글자 |
[0-9] |
숫자 |
[A-Z] |
영어 대문자 |
[a-z] |
영어 소문자 |
[A-z] |
모든 영문자 |
반복 (수량자)#
| 패턴 | 의미 |
|---|---|
a+ |
a가 1회 이상 반복 |
a* |
a가 0회 이상 반복 |
a? |
a가 0 또는 1회 |
a{n} |
a가 정확히 n회 |
a{n,} |
a가 n회 이상 |
a{n,m} |
a가 n~m회 |
POSIX 문자 클래스#
| 클래스 | 의미 |
|---|---|
[:alpha:] |
알파벳 문자 |
[:digit:] |
숫자 (0-9) |
[:alnum:] |
알파벳 + 숫자 |
[:upper:] |
대문자 |
[:lower:] |
소문자 |
[:space:] |
공백 (Tab, 줄바꿈 포함) |
[:blank:] |
공백 (스페이스, 탭) |
[:punct:] |
구두점, 특수문자 |
[:xdigit:] |
16진수 문자 |
옵션 (Flag)#
| 옵션 | 의미 |
|---|---|
c |
대소문자 구분 |
i |
대소문자 구분 안 함 |
m |
다중 라인 모드 |
2. ★ REGEXP_LIKE#
패턴과 일치하는지 검사 (WHERE 절에서만 사용)
sql
REGEXP_LIKE(원본, 패턴, [옵션])
예제#
```sql -- 이름이 '김'으로 시작하는 회원 SELECT * FROM MEMBER WHERE REGEXP_LIKE(NAME, '^김');
-- 휴대폰 번호 형식 (010-xxxx-xxxx) SELECT * FROM MEMBER WHERE REGEXP_LIKE(PHONE, '^010-\d{4}-\d{4}$');
-- 이메일 형식 SELECT * FROM MEMBER WHERE REGEXP_LIKE(EMAIL, '^[a-zA-Z0-9._]+@[a-zA-Z0-9.-]+.[a-zA-Z]+$'); ```
3. ★ REGEXP_REPLACE#
패턴과 일치하는 부분을 다른 문자열로 치환
sql
REGEXP_REPLACE(원본, 패턴, [바꿀문자열], [시작위치], [발견횟수], [옵션])
- 바꿀 문자열 생략 시 → 삭제
- 시작 위치 기본값: 1
- 발견 횟수 기본값: 0 (모두 치환)
예제#
```sql -- 숫자 모두 삭제 SELECT REGEXP_REPLACE('ABC123', '\d', '') FROM DUAL; -- 'ABC'
-- 특수문자 삭제 (영문/숫자/한글만 남김) SELECT REGEXP_REPLACE('Hello@World!!!', '[^a-zA-Z0-9가-힣]', '') FROM DUAL; -- 'HelloWorld'
-- 이름 마스킹 (두 번째 글자만 로) SELECT REGEXP_REPLACE('김민수', '(.)(.)(.)', '\1\3') FROM DUAL; -- '김수'
-- 공백 여러개 → 하나로 SELECT REGEXP_REPLACE('A B C', '\s+', ' ') FROM DUAL; -- 'A B C' ```
4. ★ REGEXP_SUBSTR#
패턴과 일치하는 문자열 추출
sql
REGEXP_SUBSTR(원본, 패턴, [시작위치], [발견횟수], [옵션], [추출그룹])
예제#
```sql -- 성(姓) 추출 (첫 글자) SELECT REGEXP_SUBSTR('김철수', '^.') FROM DUAL; -- '김'
-- 이메일에서 도메인 추출 SELECT REGEXP_SUBSTR('user@gmail.com', '@(.+)$', 1, 1, NULL, 1) FROM DUAL; -- 'gmail.com'
-- 첫 번째 숫자 그룹 추출 SELECT REGEXP_SUBSTR('Order#1234 Item#5678', '\d+') FROM DUAL; -- '1234' ```
5. ★ REGEXP_INSTR#
패턴이 처음 일치하는 위치 반환 (없으면 0)
sql
REGEXP_INSTR(원본, 패턴, [시작위치], [발견횟수])
예제#
```sql -- @ 위치 SELECT REGEXP_INSTR('user@gmail.com', '@') FROM DUAL; -- 5
-- 두 번째 . 위치 SELECT REGEXP_INSTR('a.b.c.d', '.', 1, 2) FROM DUAL; -- 4
-- 패턴이 없으면 0 SELECT REGEXP_INSTR('abc', '\d') FROM DUAL; -- 0 ```
6. REGEXP_COUNT#
패턴 일치 횟수 반환
sql
REGEXP_COUNT(원본, 패턴, [시작위치], [옵션])
예제#
```sql -- 숫자 덩어리(연속) 개수 SELECT REGEXP_COUNT('010-1234-5678', '\d+') FROM DUAL; -- 3
-- 'a' 개수 (대소문자 구분 X) SELECT REGEXP_COUNT('Banana', 'a', 1, 'i') FROM DUAL; -- 3 ```
7. 자주 나오는 패턴 예시#
| 목적 | 패턴 |
|---|---|
| 전화번호 010-xxxx-xxxx | ^010-\d{4}-\d{4}$ |
| 이메일 | ^[\w.]+@[\w.]+\.[a-zA-Z]+$ |
| 한글만 | ^[가-힣]+$ |
| 영문+숫자 조합 | ^[a-zA-Z0-9]+$ |
| 시작이 'A' | ^A |
| 끝이 'Z' | Z$ |
| 4자리 숫자 | ^\d{4}$ |
시험 핵심 체크리스트#
- 메타문자 (
\d,\w,\s,^,$,.) 의미 - 반복자 (
+,*,?,{n},{n,m}) - 문자 클래스 (
[a-z],[^abc]) - REGEXP_LIKE (조건), REGEXP_REPLACE (치환/삭제)
- REGEXP_SUBSTR (추출), REGEXP_INSTR (위치)
- 옵션 (
c/i/m) - 추출 그룹
()+ 역참조\1