정규 표현식 연산자

정규 표현식이란 무엇일까요?

정규 표현식(Regular Expression, RegExp)은 특정 패턴을 따르는 문자열을 찾거나, 검증하거나, 변환하는 데 사용되는 강력한 도구입니다. 복잡한 문자열 처리 작업을 간결하고 효율적으로 수행할 수 있게 해줍니다.

오라클 SQL에서 정규 표현식 지원

오라클 데이터베이스는 SQL 구문 내에서 정규 표현식을 활용할 수 있도록 다양한 함수를 제공합니다. 이러한 함수를 통해 데이터 검색, 데이터 유효성 검사, 데이터 변환 등의 작업을 보다 강력하고 유연하게 수행할 수 있습니다.

주요 오라클 정규 표현식 연산자

오라클에서 제공하는 주요 정규 표현식 연산자와 함께 사용 예시를 살펴보겠습니다.

1. REGEXP_LIKE

REGEXP_LIKE는 특정 패턴이 문자열 내에 존재하는지 확인하는 함수입니다. WHERE 절에서 조건으로 자주 사용됩니다.

-- 전화번호 형식이 올바른지 확인
SELECT phone_number
FROM   customers
WHERE  REGEXP_LIKE(phone_number, '^010-[0-9]{4}-[0-9]{4}$');

-- 결과 예시:
-- phone_number
-- --------------
-- 010-1234-5678
-- 010-9876-5432

설명:

  • ^: 문자열의 시작을 나타냅니다.
  • 010-: ‘010-‘ 리터럴을 찾습니다.
  • [0-9]{4}: 0부터 9까지의 숫자가 4번 반복되는 패턴을 찾습니다.
  • -: ‘-‘ 리터럴을 찾습니다.
  • $: 문자열의 끝을 나타냅니다.

2. REGEXP_INSTR

REGEXP_INSTR는 문자열 내에서 특정 패턴이 시작되는 위치를 반환하는 함수입니다.

-- 이메일 주소에서 도메인 이름 시작 위치 찾기
SELECT email,
       REGEXP_INSTR(email, '@') AS at_position
FROM   employees;

-- 결과 예시:
-- email                 at_position
-- --------------------- ----------
-- john.doe@example.com          9
-- jane.smith@test.net          11

설명:

  • @: ‘@’ 기호의 위치를 찾습니다.

3. REGEXP_SUBSTR

REGEXP_SUBSTR는 문자열 내에서 특정 패턴에 일치하는 부분 문자열을 추출하는 함수입니다.

-- URL에서 파일명 추출
SELECT url,
       REGEXP_SUBSTR(url, '[^/]+$') AS filename
FROM   documents;

-- 결과 예시:
-- url                             filename
-- --------------------------------- ----------------
-- http://example.com/images/logo.png logo.png
-- http://test.net/files/report.pdf   report.pdf

설명:

  • [^/]+: ‘/’ 문자가 아닌 문자가 1번 이상 반복되는 패턴을 찾습니다.
  • $: 문자열의 끝을 나타냅니다.

4. REGEXP_REPLACE

REGEXP_REPLACE는 문자열 내에서 특정 패턴에 일치하는 부분을 다른 문자열로 대체하는 함수입니다.

-- HTML 태그 제거
SELECT html_text,
       REGEXP_REPLACE(html_text, '<[^>]*>', '') AS plain_text
FROM   articles;

-- 결과 예시:
-- html_text                                   plain_text
-- --------------------------------------------- -----------------------------------------
-- <p>Hello</p><b>World</b>          HelloWorld
-- <h1>Title</h1><p>Content</p>      TitleContent

설명:

  • <[^>]*>: '<'로 시작하고 '>'로 끝나는 모든 HTML 태그를 찾습니다.
  • '': 빈 문자열로 대체하여 태그를 제거합니다.

5. REGEXP_COUNT

REGEXP_COUNT는 Oracle 11g Release 2부터 지원하는 함수로, 문자열 내에서 특정 패턴이 나타나는 횟수를 반환합니다.

-- 문자열에서 특정 단어의 빈도수 계산
SELECT text,
       REGEXP_COUNT(text, 'Oracle', 1, 'i') AS oracle_count
FROM   comments;

-- 결과 예시:
-- text                                         oracle_count
-- --------------------------------------------- ------------
-- Oracle is a great database. Oracle provides...            2
-- This is a test comment about databases.                 0

설명:

  • Oracle: 찾을 단어입니다.
  • 1: 검색을 시작할 위치 (1은 문자열의 시작).
  • i: 대소문자를 구분하지 않는 옵션입니다.

정규 표현식 메타문자

정규 표현식에서 특별한 의미를 가지는 메타문자를 이해하는 것은 매우 중요합니다.

  • .: 임의의 문자 하나
  • *: 앞의 문자가 0번 이상 반복
  • +: 앞의 문자가 1번 이상 반복
  • ?: 앞의 문자가 0번 또는 1번 나타남
  • []: 문자 집합 (예: [a-z], [0-9])
  • [^]: 문자 집합의 부정 (예: [^0-9])
  • ^: 문자열의 시작
  • $: 문자열의 끝
  • |: OR 연산 (예: a|b)
  • (): 그룹화
  • {}: 반복 횟수 지정 (예: {3}, {3,5})

고급 활용 예시

더욱 복잡한 시나리오에서 정규 표현식을 활용하는 예시를 살펴보겠습니다.

예시 1: 복잡한 이메일 주소 검증

SELECT email
FROM   users
WHERE  REGEXP_LIKE(email,
                      '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$');

설명:

  • [a-zA-Z0-9._%+-]+: 이메일 주소의 사용자 이름 부분을 나타냅니다.
  • @: '@' 기호
  • [a-zA-Z0-9.-]+: 도메인 이름 부분을 나타냅니다.
  • \.: '.' 기호를 나타냅니다 (이스케이프 필요).
  • [a-zA-Z]{2,}: 최상위 도메인(TLD) 부분을 나타냅니다 (2글자 이상).

예시 2: CSV 데이터 파싱

-- CSV 문자열에서 각 필드 추출
WITH dataset AS (
  SELECT 'John,Doe,30,New York' AS csv_string
  FROM dual
)
SELECT REGEXP_SUBSTR(csv_string, '[^,]+', 1, 1) AS first_name,
       REGEXP_SUBSTR(csv_string, '[^,]+', 1, 2) AS last_name,
       REGEXP_SUBSTR(csv_string, '[^,]+', 1, 3) AS age,
       REGEXP_SUBSTR(csv_string, '[^,]+', 1, 4) AS city
FROM   dataset;

-- 결과 예시:
-- first_name last_name       age city
-- ---------- --------------- --- --------
-- John       Doe             30  New York

설명:

  • [^,]+: ',' 문자가 아닌 문자가 1번 이상 반복되는 패턴을 찾습니다.
  • 1, 1, 1, 2, 1, 3, 1, 4: 각 필드의 위치를 지정합니다.

주의사항

정규 표현식은 강력하지만, 복잡한 패턴은 성능 저하를 초래할 수 있습니다. 따라서 성능을 고려하여 효율적인 정규 표현식을 작성하는 것이 중요합니다. 또한, 정규 표현식은 데이터베이스 버전 및 설정에 따라 동작이 다를 수 있으므로 주의해야 합니다.

결론

오라클 데이터베이스에서 제공하는 정규 표현식 연산자는 문자열 처리 작업을 매우 효율적으로 수행할 수 있도록 돕습니다. 이러한 연산자들을 활용하여 복잡한 데이터 패턴을 다루고, 데이터 품질을 개선하며, 다양한 데이터 처리 요구 사항을 충족시킬 수 있습니다. 다양한 예제와 함께 제공된 이 가이드가 정규 표현식 활용에 도움이 되기를 바랍니다.

위로 스크롤