정규표현식에 대해 자세히 알아보자!
f
firststep 에디터
IT / 자격증 전문 라이터
2026년 2월 26일945
정규표현식에 대해 자세히 알아보자!
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: 개수
f
firststep 에디터 · IT / 자격증 전문 라이터
firststep.kr의 실무 에디터로서 무언가를 처음 도전하는 분들이 헤매지 않도록 검증된 지식과 실습 가이드를 작성합니다.
댓글 0개
댓글을 작성하려면 로그인이 필요합니다
간단한 이메일과 비밀번호로 3초 만에 가입하고 의견을 남겨보세요.
첫 번째 댓글을 남겨보세요!