2-2-8. 정규 표현식

박은서's avatar
Mar 02, 2026
2-2-8. 정규 표현식

1. 정규표현식

1️⃣ 기초 개념

1) 정규표현식

  • 문자와 기호를 조합하여 특정 패턴을 정의하는 방식
  • 기본 구성 요소 : 문자, 숫자, 특수 문자 등
  • 특정한 규칙을 따라 조합되어 복잡한 검색 조건 만들 수 있음

2️⃣ 정규표현식의 주요 구성 요소

1) 문자 클래스

  • 대괄호 [] 안에 여러 문자를 넣어 하나의 문자 집합을 정의
  • [abc] : ‘a’, ‘b’, ‘c’ 중 하나의 문자
  • [a-z] : 소문자 알파벳 중 하나의 문자
  • [^abc] : ‘a’, ‘b’, ‘c’를 제외한 모든 문자

2) 메타 문자

  • 특별한 의미를 가진 문자들
  • . : 임의의 한 문자
  • \d : 숫자
  • \D : 숫자가 아닌 문자
  • \w : 알파벳 문자나 숫자, 밑줄
  • \W : 알파벳 문자나 숫자, 밑줄이 아닌 문자
  • \s : 공백 문자
  • \S : 공백 문자가 아닌 문자

3) 수량자

  • 특정 패턴이 반복되는 횟수 정의
  • * : 0회 이상 반복
  • + : 1회 이상 반복
  • ? : 0회 도는 1회
  • {n} : 정확히 n회
  • {n,} : n회 이상
  • {n, m} : n회 이상 m회 이하

4) 경계 지정자

  • 특정 위치 지정
  • ^ : 문자열의 시작
  • $ : 문자열의 끝
  • \b : 단어 경계
  • \B : 단어 경계가 아님

2. 정규표현식 문법

1️⃣ POSIX 연산자

1) POSIX(Portable Operating System Interface) 정규표현식

  • 유닉스 기반 시스템에서 널리 사용되는 표준 정규표현식 규칙
  • 기본 모드(POSIX Basic Regular Expressions, BRE)와
    • 확장 모드(POSIX Extended Regular Expressions, ERE) 두 가지 제공

2) REGEXP_SUBSTR 함수

  • 주어진 문자열에서 정규표현식 패턴과 일치하는 첫 번째 부분 문자열 반환
REGEXP_SUBSTR(source_string, pattern)
  • . → dot 연산자 예시
    • SELECT REGEXP_SUBSTR ('aab', 'a.b') AS C1, REGEXP_SUBSTR ('abb', 'a.b') AS C2, REGEXP_SUBSTR ('acb', 'a.b') AS C3, REGEXP_SUBSTR ('adc', 'a.b') AS C4 FROM DUAL;
      C1
      C2
      C3
      C4
      aab
      abb
      acb
      NULL
    • a.b : ‘a’로 시작하고, 임의의 한 문자(.)를 포함하여 ‘b’로 끝나는 문자열
  • | → or 연산자 예시
    • SELECT REGEXP_SUBSTR ('apple', 'a|e') AS C1, REGEXP_SUBSTR ('banana', 'a|b') AS C2, REGEXP_SUBSTR ('abcdef', 'ab|cd') AS C3, REGEXP_SUBSTR ('cdefgh', 'ab|cd') AS C4 FROM DUAL;
      C1
      C2
      C3
      C4
      a
      b
      ab
      cd
    • a|b : ‘a’ 또는 ‘e’ 중에서 첫 번째로 일치하는 부분 문자열 찾음
  • \ → backslash 연산자 예시
    • SELECT REGEXP_SUBSTR ('a.b', 'a\.b') AS C1, REGEXP_SUBSTR ('aab', 'a\.b') AS C2, REGEXP_SUBSTR ('a\\b', 'a\\\\b') AS C3, REGEXP_SUBSTR ('a\b', 'a\\\\b') AS C4 FROM DUAL;
      C1
      C2
      C3
      C4
      a.b
      NULL
      a\\b
      NULL
    • \ : \뒤에 오는 특수 문자를 문자 칼럼 그래도 표시
    • a\.ba.b
  • ^, $ : 앵커(anchor) 연산자 예시
    • ^ : 문자열 시작을 의미
    • $ : 문자열의 끝을 의미
    • SELECT REGEXP_SUBSTR ('apple', '^a') AS C1, REGEXP_SUBSTR ('banana', '^a') AS C2, REGEXP_SUBSTR ('apple pie', '^apple') AS C3, REGEXP_SUBSTR ('apple', 'e$') AS C4, REGEXP_SUBSTR ('banana', 'a$') AS C5, REGEXP_SUBSTR ('apple pie', 'pie$') AS C6, REGEXP_SUBSTR ('apple', '^apple$') AS C7, REGEXP_SUBSTR ('banana', '^apple$') AS C8, REGEXP_SUBSTR ('apple pie', '^a.*e%') AS C9 FROM DUAL;
      C1
      C2
      C3
      C4
      C5
      C6
      C7
      C8
      C9
      a
      NULL
      apple
      e
      a
      pie
      apple
      NULL
      apple
  • 수량자(quantifier) 연산자의 예시
    • 수량자(quantifier) 연산자 : 특정 패턴의 반복 횟수 지정
      • 수량자 연산자
        해설
        *
        0회 이상 반복 예) a*는 “”, “a”, “aa”, “aaa” 등과 일치
        +
        1회 이상 반복 예) a+는 “a”, “aa”, “aaa” 등과 일치하지만 “”와는 일치하지 않음
        ?
        0회 또는 1회 발생 예) a?는 “”, “a”와 일치
        {n}
        정확히 n회 반복 예) a{3}은 “aaa”와 일치
        {n,}
        n회 이상 반복 예) a{2,}는 “aa”, “aaa”, “aaaa” 등과 일치
        {n,m}
        n회 이상 m회 이하 반복 예) a{2,4} 는 “aa”, “aaa”, “aaaa” 와 일치
      SELECT REGEXP_SUBSTR ('ac', 'ab*c') AS C1, REGEXP_SUBSTR ('abc', 'ab*c') AS C2, REGEXP_SUBSTR ('abbc', 'ab*c') AS C3, REGEXP_SUBSTR ('ac', 'ab+c') AS C4, REGEXP_SUBSTR ('abc', 'ab+c') AS C5, REGEXP_SUBSTR ('abbc', 'ab+c') AS C6, REGEXP_SUBSTR ('ac', 'ab?c') AS C7, REGEXP_SUBSTR ('abc', 'ab?c') AS C8, REGEXP_SUBSTR ('abbc', 'ab?c') AS C9 FROM DUAL;
      C1
      C2
      C3
      C4
      C5
      C6
      C7
      C8
      C9
      ac
      abc
      abbc
      NULL
      abc
      abbc
      ac
      abc
      NULL
      SELECT REGEXP_SUBSTR ('aaa', 'a{3}') AS C1, REGEXP_SUBSTR ('aaaa', 'a{3}') AS C2, REGEXP_SUBSTR ('aaa', 'a{2,}') AS C3, REGEXP_SUBSTR ('aaa', 'a{2,4}') AS C4, REGEXP_SUBSTR ('aaaaa', 'a{2,4}') AS C5 FROM DUAL;
      C1
      C2
      C3
      C4
      C5
      aaa
      aaa
      aaa
      aaa
      aaaa
  • () → 괄호 연산자 예시
    • 괄호 연산자 기능
      • 그룹화 (Grouping)
        • 괄호 ()를 사용하여 정규표현식 내에서 패턴 그룹화할 수 있음 • 그룹화된 패턴에 대해 수량자 적용하거나, 패턴의 일부분 묶어서 재사용 가능 • 예) (abc)+는 ‘abc’라는 문자열이 하나 이상 반복되는 경우에 일치
        캡처 (Capturing)
        • 그룹화된 패턴은 캡처되며, 나중에 이를 참조할 수 있음 • 캡처된 그룹은 정규표현식 나머지 부분에서 백슬래시(\)와 숫자(\1, \2, 등)를 사용하여 참조 가능 • 예) (abc) \1은 ‘abcabc’와 일치. 여기서 \1은 첫 번째 그룹(abc) 참조
      SELECT REGEXP_SUBSTR ('ababab', '(ab)+') AS C1, REGEXP_SUBSTR ('abcdabcd', '(ab)(cd) \1\2') AS C2, REGEXP_SUBSTR ('abcabc', '(abc){2}') AS C3 FROM DUAL;
      C1
      C2
      C3
      ababab
      abcdabcd
      abcabc
  • 문자 리스트(character list) 연산자 예시
    • SELECT REGEXP_SUBSTR ('apple', '[abc]') AS C1, REGEXP_SUBSTR ('cat', '[a-c]') AS C2, REGEXP_SUBSTR ('zip code 12345', '[0-9]') AS C3, REGEXP_SUBSTR ('cherry', '[^abc]') AS C4 FROM DUAL;
      C1
      C2
      C3
      C4
      a
      c
      1
      h

2️⃣ PERL 정규표현식 연산자

1) PERL

  • 강력한 정규표현식 기능 제공
  • POSIX 문자 클래스와 유사하게 동작

2) PERL 정규표현식 연산자

NO
연산자
해설
동일
1번
\d
숫자
[[:digit:]]
2번
\D
숫자가 아닌 모든 문자
[^[:digit:]]
3번
\w
숫자와 영문자 (언더바 포함)
[[:alnum:]_]
4번
\W
숫자와 영문자가 아닌 모든 문자 (언더바 제외)
[^[:alnum:]]
5번
\s
공백
[[:space:]]
6번
\S
공백 문자가 아닌 모든 문자
[^[:space:]]

3) PERL 정규표현식 연산자 예시

SELECT REGEXP_SUBSTR('abc123', '\d') AS C1, REGEXP_SUBSTR('abc123', '[[:digit:]]') AS C2, REGEXP_SUBSTR('123abc', '\D') AS C3, REGEXP_SUBSTR('123abc', '[^[:digit:]]') AS C4, REGEXP_SUBSTR('Hello_World123!', '\w') AS C5, REGEXP_SUBSTR('Hello_World123!', '[[:alnum:]_]') AS C6, REGEXP_SUBSTR('Hello_World123!', '\W') AS C7, REGEXP_SUBSTR('Hello_World123!', '[^[:alnum:]]') AS C8, REGEXP_SUBSTR('Hello World', '\s') AS C9, REGEXP_SUBSTR('Hello World', '[[:space:]]') AS C10, REGEXP_SUBSTR('Hello World', '\S') AS C11, REGEXP_SUBSTR('Hello World', '[^[:space:]]') AS C12 FROM DUAL;
C1
C2
C3
C4
C5
C6
C7
C8
C9
C10
C11
C12
1
1
a
a
H
H
!
!
H
H

3. 정규표현식 조건과 함수

1️⃣ REGEXP_LIKE 조건

1) REGEXP_LIKE 함수

  • 오라클에서 사용되는 함수
  • 문자열이 특정 정규표현식 패턴과 일치하는지 확인하는 데 사용됨
  • 주로 SQL 쿼리에서 조건절에 사용되어 문자열이 특정 패턴을 만족하는지 여부에 따라 결과 필터링

2) REGEXP_LIKE 함수의 예

  • 특정 패턴을 포함하는 행 찾기
    • SELECT ENAME, JOB FROM EMP WHERE REGEXP_LIKE(ENAME, '^A');
      ENAME
      JOB
      ALLEN
      SALESMAN
      ADAMS
      CLERK
    • ENAME이 ‘A’로 시작하는 모든 직원
  • 대소문자를 구분하지 않고 패턴 일치
    • SELECT ENAME, JOB FROM EMP WHERE REGEXP_LIKE(ENAME, 'smith', 'i');
      ENAME
      JOB
      SMITH
      CLERK
    • ENAME에 ‘smith’가 포함된 모든 직원
    • ‘i’ 플래그는 대소문자 구분하지 않음
  • 숫자를 포함하는 행 찾기
    • SELECT ENAME, JOB, SAL, COMM FROM EMP WHERE REGEXP_LIKE(COMM, '\d');
      ENAME
      JOB
      SAL
      COMM
      ALLEN
      SALESMAN
      1600
      300
      WARD
      SALESMAN
      1250
      500
      MARTIN
      SALESMAN
      1250
      1400
      TURNER
      SALESMAN
      1500
      0
    • COMM 칼럼에 숫자(\d)가 포함된 모든 행
  • 특정 형식의 패턴 찾기
    • SELECT LAST_NAME, EMAIL, PHONE FROM EMPLOYEES WHERE REGEXP_LIKE(PHONE, '^\d{3}.\d{3}.\d{4}$') AND ROWNUM <= 5;
      LAST_NAME
      EMAIL
      PHONE
      Payne
      summer.payne@example.com
      515.123.8181
      Stephens
      rose.stephens@example.com
      515.123.8080
      Dunn
      annabelle.dunn@example.com
      515.123.4444
      Bailey
      tommy.bailey@example.com
      515.123.4567
      Cooper
      blake.cooper@example.com
      515.123.4569
    • PHONE 칼럼에 ‘XXX.XXX.XXXX’ 형식(숫자 3개, 점, 숫자 3개, 점, 숫자 4개)과 일치하는 모든 연락처 중 상위 5개만 출력
  • 공백 또는 탭 문자를 포함하는 행 찾기
    • SELECT PRODUCT_NAME, DESCRIPTION, LIST_PRICE FROM PRODUCTS WHERE REGEXP_LIKE(PRODUCT_NAME, '\s') AND ROWNUM <= 5;
      PRODUCT_NAME
      DESCRIPTION
      LIST_PRICE
      Intel Xeon E5-2699 V3 (OEM/Tray)
      Speed:2.3GHz,Cores:18,TDP:145W
      3410.46
      Intel Xeon E5-2697 V3
      Speed:2.6GHz,Cores:14,TDP:145W
      2774.98
      Intel Xeon E5-2698 V3 (OEM/Tray)
      Speed:2.3GHz,Cores:16,TDP:135W
      2660.75
      Intel Xeon E5-2697 V4
      Speed:2.3GHz,Cores:18,TDP:145W
      2554.99
      Intel Xeon E5-2685 V3 (OEM/Tray)
      Speed:2.6GHz,Cores:12,TDP:120W
      2501.69
    • PRODUCT_NAME에 공백이나 탭 문자(\s)가 포함된 모든 제품

2️⃣ REGEXP_REPLACE 함수

1) REGEXP_REPLACE 함수

  • 오라클에서 제공하는 함수
  • 정규표현식을 사용해 문자열에서 특정 패턴을 찾아 다른 문자열로 대체하는 데 사용됨
  • 일반적인 REPLACE 함수보다 더 복잡한 패턴 매칭과 교체 작업을 수행할 수 있어 유연한 문자열 조작 가능

2) REGEXP_REPLACE 함수의 예

  • 특정 패턴을 다른 문자열로 대체
    • SELECT REGEXP_REPLACE('123abc456def', '\d', '#') AS RESULT FROM DUAL;
      RESULT
      ###abc###def
    • 숫자(\d)와 일치하는 모든 문자를 ‘#’으로 대체
  • 여러 개의 공백을 하나의 공백으로 대체
    • SELECT REGEXP_REPLACE('Hello World SQL', '\s+', ' ') AS RESULT FROM DUAL;
      RESULT
      Hello World SQL
  • 대소문자 구분 없이 문자열 대체
    • SELECT REGEXP_REPLACE('Hello World', 'world', 'Universe', 1, 0, 'i') AS RESULT FROM DUAL;
      RESULT
      Hello Universe
    • Hello World에서 ‘world’를 ‘Universe’로 대체
    • 숫자 1 : 검색 시작 위치, 첫째자리부터 검색한다는 의미
    • 숫자 0 : 대치할 일치 항목의 순서, 모든 값이 일치했을 때라는 조건 의미
    • ‘i’ : 대소문자 구분하지 않음
  • 전화번호 형식 변환
    • SELECT REGEXP_REPLACE('123-456-7890', '(\d{3})-(\d{3})-(\d{4})', '(\1)-\2-\3') AS RESULT FROM DUAL;
      RESULT
      (123) 456-7890
    • \1, \2, \3 : 각각 첫 번째, 두 번째, 세 번째 그룹을 참조
  • 문자열에서 모든 숫자를 제거
    • SELECT REGEXP_REPLACE('Address 1234, ZIP 56789', '\d', '') AS RESULT FROM DUAL;
      RESULT
      Address , ZIP
    • 문자열에서 숫자(\d)를 모두 제거
    • 숫자를 제거해도 숫자 앞, 뒤의 공백은 삭제되지 않음

3️⃣ REGEXP_INSTR 함수

1) REGEXP_INSTR 함수

  • 오라클에서 제공하는 함수
  • 정규표현식을 사용해 문자열에서 특정 패턴이 처음 나타나는 위치를 찾는 데 사용됨
  • 일반적인 INSTR 함수와 유사하지만, 정규표현식을 통해 더 복잡한 패턴 매칭을 수행할 수 있음

2) REGEXP_INSTR 함수의 형식

REGEXP_INSTR( source_string, pattern, position, occurrence, return_option, match_parameter )
  • source_string
    • 검사할 원본 문자열
  • pattern
    • 정규표현식 패턴
    • 일치하는 패턴의 위치를 찾음
  • position
    • (선택 사항)
    • 검색을 시작할 위치
    • 기본값 : 1
  • occurrence
    • (선택 사항)
    • 패턴과 일치하는 몇 번째 위치를 찾을 것인지를 지정
  • return_option
    • (선택 사항)
    • 패턴이 일치하는 위치의 시작점(0) 또는 끝점(1)을 반환할지 지정
    • 기본값 : 0 (시작 위치)
  • match_parameter
    • (선택 사항)
    • 정규표현식의 동작을 제어하는 플래그
    • 예) ‘i’를 사용하면 대소문자 구분하지 않음

3) REGEXP_INSTR 함수의 예

  • 첫 번째 일치 위치 찾기
    • SELECT REGEXP_INSTR('오라클SQL Developer', 'SQL') AS RESULT FROM DUAL;
      RESULT
      4
  • 특정 위치에서 검색 시작
    • SELECT REGEXP_INSTR('SQL SQL SQL', 'SQL', 5) AS RESULT FROM DUAL;
      RESULT
      5
  • 여러 번째 일치 위치 찾기
    • SELECT REGEXP_INSTR('SQL SQL SQL', 'SQL', 1, 2) AS RESULT FROM DUAL;
      RESULT
      5
  • 대소문자 구분 없이 검색
    • SELECT REGEXP_INSTR('오라클SQL Developer', 'sql', 1, 1, 0, 'i') AS RESULT FROM DUAL;
      RESULT
      4

4️⃣ REGEXP_COUNT 함수

1) REGEXP_COUNT 함수

  • 오라클에서 제공하는 함수
  • 문자열에서 정규표현식을 사용해 특정 패턴이 몇 번 나타나는지 계산하는 데 사용됨
  • 데이터 분석 및 검증 작업에서 매우 유용하게 활용

2) REGEXP_COUNT 함수의 형식

REGEXP_COUNT(source_string, pattern, position, match_parameter)
  • source_string
    • 패턴을 검색할 원본 문자열
  • pattern
    • 정규표현식 패턴
    • 이 패턴이 문자열에서 몇 번 나타나는지 계산
  • position
    • (선택 사항)
    • 검색을 시작할 위치
    • 기본값 : 1
  • match_parameter
    • (선택 사항)
    • 정규표현식의 동작을 제어하는 플래그
    • 예) ‘i’를 사용하면 대소문자 구분하지 않음

3) REGEXP_COUNT 함수의 예

  • 특정 패턴의 출현 횟수 계산
    • SELECT REGEXP_COUNT('abc123abc456abc', 'abc') AS RESULT FROM DUAL;
      RESULT
      3
  • 숫자 패턴의 출현 횟수 계산
    • SELECT REGEXP_COUNT('abc123abc456abc789', '\d{3}') AS RESULT FROM DUAL;
      RESULT
      3
  • 특정 위치에서 패턴의 출현 횟수 계산
    • SELECT REGEXP_COUNT('abc123abc456abc', 'abc', 5) AS RESULT FROM DUAL;
      RESULT
      2
  • 대소문자 구분 없이 패턴의 출현 횟수 계산
    • SELECT REGEXP_COUNT('OracleSQL Oraclesql', 'oracle', 1, 'i') AS RESULT FROM DUAL;
      RESULT
      2
 
Share article