sqld
정규표현식에 대해 자세히 알아보자!
자격증원톱
2026. 2. 26. 11:19
반응형
정규표현식에 대해 자세히 알아보자!
반응형

1) 정규표현식(Regex) 한 줄 정의
문자열에서 “찾을 패턴”을 기호로 표현하는 규칙입니다.
→ “특정 형식 찾기(전화번호/이메일/숫자 포함 여부)” 같은 걸 빠르게 처리합니다.
2) 패턴을 만드는 핵심 부품(기초)
(1) 문자 클래스(대괄호 [])
- [abc] : a 또는 b 또는 c 중 1개
- [a-z] : 소문자 1개
- [0-9] : 숫자 1개
- [^abc] : a,b,c 가 아닌 문자 1개
예)
- 'zip code 12345'에서 [0-9] → 첫 숫자 '1' 매칭
(2) 메타 문자(자주 쓰는 축약)
- . : 아무 문자 1개
- \d : 숫자 1개 (Perl 계열)
- \D : 숫자가 아닌 1개
- \w : 영문/숫자/_(언더바)
- \W : \w가 아닌 것
- \s : 공백(스페이스/탭 등)
- \S : 공백이 아닌 것
POSIX 방식으로도 표현 가능: \d ≈ [[:digit:]], \s ≈ [[:space:]] 등
(3) 수량자(Quantifier) — “몇 번 반복?”
- * : 0번 이상
- + : 1번 이상
- ? : 0 또는 1번
- {n} : 정확히 n번
- {n,} : 최소 n번
- {n,m} : n~m번
예)
- a{3} : a가 정확히 3번 → "aaa"
- a{2,4} : a가 2~4번 → "aa", "aaa", "aaaa"
(4) 앵커(경계 지정)
- ^ : 문자열 시작
- $ : 문자열 끝
예)
- ^apple : “apple로 시작”
- pies$ : “pies로 끝”
(5) 이스케이프(백슬래시 \)
정규식에서 특별한 의미를 가진 문자를 “그 문자 그대로” 쓰려면 이스케이프합니다.
예)
- .은 “아무 문자”니까 “점(.) 자체”를 찾으려면 \.
→ 패턴: a\.b 는 "a.b"에만 매칭
3) 괄호 () — 그룹(Grouping) & 캡처(Capturing)
(1) 그룹핑
- 여러 패턴을 한 덩어리로 묶어서 수량자를 적용할 때 사용
- 예: (ab)+ → "ab"가 1번 이상 반복 (ab, abab, ababab…)
(2) 캡처 + 역참조(Backreference) \1, \2 …
- 괄호로 잡은 내용을 “다시 재사용”할 수 있습니다.
- 예: (ab)(cd)\1\2
- (ab)=1번 그룹, (cd)=2번 그룹
- 뒤에 \1\2 → "ab"+"cd"가 다시 나와야 함
- 결과적으로 "abcdabcd" 같은 문자열에 매칭
4) Oracle에서 자주 쓰는 정규식 함수 4종 (핵심)
(1) REGEXP_LIKE : “조건 필터(WHERE에서 많이 씀)”
이 패턴이 포함/일치하냐? (True/False)
예1) ENAME이 A로 시작하는 사람
SELECT ename, job
FROM emp
WHERE REGEXP_LIKE(ename, '^A');
예2) 대소문자 무시 옵션 i
SELECT ename
FROM emp
WHERE REGEXP_LIKE(ename, 'smith', 'i');
예3) 전화번호 형태 검사(예: 123-456-7890)
WHERE REGEXP_LIKE(phone, '^\d{3}-\d{3}-\d{4}$');
(2) REGEXP_SUBSTR : “매칭되는 부분 문자열 추출”
패턴과 일치하는 ‘조각’을 뽑아냄
예) 'zip code 12345'에서 첫 숫자 덩어리
SELECT REGEXP_SUBSTR('zip code 12345', '\d+') FROM dual;
-- 결과: 12345
(3) REGEXP_REPLACE : “패턴을 찾아 바꾸기”
정규식으로 치환합니다.
예1) 숫자를 전부 #로 바꾸기
SELECT REGEXP_REPLACE('12abc345def', '\d', '#') FROM dual;
-- 결과: ##abc###def
예2) 여러 공백을 하나로 줄이기
SELECT REGEXP_REPLACE('Hello World SQL', '\s+', ' ') FROM dual;
-- 결과: Hello World SQL
예3) 전화번호 형식 바꾸기(캡처 사용)
SELECT REGEXP_REPLACE('123-456-7890',
'(\d{3})-(\d{3})-(\d{4})',
'(\1) \2-\3')
FROM dual;
-- 결과: (123) 456-7890
예4) 문자열에서 숫자 제거
SELECT REGEXP_REPLACE('Address 1234, ZIP 56789', '\d', '') FROM dual;
-- 결과: Address , ZIP
5) REGEXP_INSTR : “패턴이 처음 나타나는 위치”
몇 번째 위치에 있나?를 반환합니다.
예) 'OracleSQL Developer'에서 SQL 위치
SELECT REGEXP_INSTR('OracleSQL Developer', 'SQL') FROM dual;
-- 결과: 8 (같은 식)
옵션으로 “n번째 등장 위치”도 찾습니다.
5) REGEXP_COUNT : “몇 번 등장하나?”
패턴의 출현 횟수를 셉니다.
예1) 'abc123abc456abc'에서 abc 개수
SELECT REGEXP_COUNT('abc123abc456abc', 'abc') FROM dual;
-- 결과: 3
예2) 대소문자 무시
SELECT REGEXP_COUNT('OracleSQL OracleSql', 'oracle', 1, 'i') FROM dual;
-- 결과: 2
6) 전체 흐름을 한 번에 이해하는 실전 예시 3개
예시 A) “숫자 포함된 행만 찾기”
- 목표: COMM 컬럼에 숫자가 있는 행 찾기
WHERE REGEXP_LIKE(comm, '\d')
예시 B) “문자열에서 ‘첫 번째 숫자 묶음’ 추출”
- 목표: '주문번호: A-2026-001'에서 2026 추출
REGEXP_SUBSTR('A-2026-001', '\d+')
예시 C) “입력값 정리(클렌징)”
- 목표: 사용자 입력 " hello world " → "hello world"
TRIM(REGEXP_REPLACE(text, '\s+', ' '))
7) 암기용 요약
- [] 문자 중 하나 선택, ^$ 시작/끝 고정
- \d \w \s 같은 축약 클래스(Perl) / [[:digit:]] 같은 POSIX 클래스
- 수량자 * + ? {n} {n,} {n,m} 반복 횟수
- () + \1 그룹 + 재사용(역참조)
- SQL에서:
- REGEXP_LIKE: 필터
- REGEXP_SUBSTR: 추출
- REGEXP_REPLACE: 치환/정제
- REGEXP_INSTR: 위치
- REGEXP_COUNT: 개수
반응형