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: 개수
반응형