콘텐츠로 이동

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