정규 표현식이란 무엇일까요?
정규 표현식(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
: 각 필드의 위치를 지정합니다.
주의사항
정규 표현식은 강력하지만, 복잡한 패턴은 성능 저하를 초래할 수 있습니다. 따라서 성능을 고려하여 효율적인 정규 표현식을 작성하는 것이 중요합니다. 또한, 정규 표현식은 데이터베이스 버전 및 설정에 따라 동작이 다를 수 있으므로 주의해야 합니다.
결론
오라클 데이터베이스에서 제공하는 정규 표현식 연산자는 문자열 처리 작업을 매우 효율적으로 수행할 수 있도록 돕습니다. 이러한 연산자들을 활용하여 복잡한 데이터 패턴을 다루고, 데이터 품질을 개선하며, 다양한 데이터 처리 요구 사항을 충족시킬 수 있습니다. 다양한 예제와 함께 제공된 이 가이드가 정규 표현식 활용에 도움이 되기를 바랍니다.