정규 표현식 개요

정규 표현식 개요

오라클 데이터베이스는 복잡한 문자열 패턴 매칭 및 조작을 위해 SQL 및 PL/SQL 환경에서 정규 표현식을 지원합니다. 이는 데이터 검증, 데이터 추출, 문자열 대체 등 다양한 작업에 유용하게 활용됩니다. 이 가이드에서는 오라클에서 제공하는 정규 표현식 기능과 실무적인 활용법을 자세히 살펴보겠습니다.

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

오라클은 SQL 내에서 정규 표현식을 사용하기 위한 다양한 함수를 제공합니다. 주요 함수는 다음과 같습니다:

  • REGEXP_LIKE: 특정 패턴과 일치하는지 여부를 확인합니다.
  • REGEXP_INSTR: 패턴이 나타나는 위치를 찾습니다.
  • REGEXP_SUBSTR: 패턴과 일치하는 하위 문자열을 추출합니다.
  • REGEXP_REPLACE: 패턴과 일치하는 부분을 다른 문자열로 대체합니다.

정규 표현식 연산자

오라클 정규 표현식은 다양한 연산자(메타 문자)를 사용하여 패턴을 정의합니다. 몇 가지 주요 연산자는 다음과 같습니다:

  • .: 임의의 단일 문자.
  • *: 앞선 패턴의 0회 이상 반복.
  • +: 앞선 패턴의 1회 이상 반복.
  • ?: 앞선 패턴의 0회 또는 1회 반복.
  • [ ]: 문자 집합 정의. 예: [abc]는 a, b, c 중 하나.
  • [^ ]: 문자 집합 제외. 예: [^abc]는 a, b, c를 제외한 문자.
  • ^: 문자열의 시작.
  • $: 문자열의 끝.
  • |: OR 연산.
  • ( ): 하위 표현식 그룹화.

기본 사용 예시

REGEXP_LIKE를 사용한 패턴 일치 확인

다음은 employees 테이블에서 이름이 “Smith”로 시작하는 직원을 찾는 예제입니다.

“`sql SELECT * FROM employees WHERE REGEXP_LIKE(last_name, ‘^Smith’); “`

실행 결과:

“` — (이름이 Smith로 시작하는 직원 목록) “`

REGEXP_INSTR를 사용한 패턴 위치 찾기

다음은 이메일 주소에서 ‘@’ 문자의 위치를 찾는 예제입니다.

“`sql SELECT email, REGEXP_INSTR(email, ‘@’) AS at_position FROM customers; “`

실행 결과:

“` — 이메일 주소와 ‘@’ 문자 위치 목록 “`

REGEXP_SUBSTR를 사용한 하위 문자열 추출

다음은 전화번호에서 숫자 부분만 추출하는 예제입니다.

“`sql SELECT phone_number, REGEXP_SUBSTR(phone_number, ‘[0-9]+’) AS numeric_part FROM contacts; “`

실행 결과:

“` — 전화번호와 숫자 부분 목록 “`

REGEXP_REPLACE를 사용한 문자열 대체

다음은 문자열에서 여러 공백을 단일 공백으로 대체하는 예제입니다.

“`sql SELECT address, REGEXP_REPLACE(address, ‘ +’, ‘ ‘) AS cleaned_address FROM locations; “`

실행 결과:

“` — 주소와 정리된 주소 목록 “`

실무 활용 사례

이메일 주소 유효성 검사

다음은 customers 테이블에서 유효한 이메일 주소 형식을 가진 레코드만 선택하는 예제입니다. 복잡한 패턴을 사용하여 더욱 정확하게 검증할 수 있습니다.

“`sql SELECT * FROM customers WHERE REGEXP_LIKE(email, ‘^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$’); “`

실행 결과:

“` — 유효한 이메일 주소를 가진 고객 목록 “`

URL에서 도메인 추출

다음은 웹사이트 URL에서 도메인 이름을 추출하는 예제입니다.

“`sql SELECT website, REGEXP_SUBSTR(website, ‘https?://([A-Za-z0-9.-]+)’) AS domain FROM company_profiles; “`

실행 결과:

“` — 웹사이트와 도메인 목록 “`

데이터 마스킹

개인 정보 보호를 위해 신용카드 번호의 일부를 ‘*’ 문자로 대체하는 예제입니다.

“`sql SELECT credit_card, REGEXP_REPLACE(credit_card, ‘([0-9]{4})[0-9]+([0-9]{4})’, ‘\1****\2’) AS masked_card FROM payment_info; “`

실행 결과:

“` — 신용카드 번호와 마스킹된 신용카드 번호 목록 “`

고급 활용 기법

역참조 (Backreference) 활용

역참조는 괄호로 묶인 하위 표현식에 일치하는 텍스트를 나중에 다시 참조하는 기능입니다. 신용카드 번호 마스킹 예제에서 \1\2가 역참조입니다.

다양한 패턴 옵션

REGEXP_LIKE 함수는 다양한 옵션을 지원합니다. 예를 들어, 대소문자를 구분하지 않고 패턴을 찾으려면 ‘i’ 옵션을 사용합니다.

“`sql SELECT * FROM products WHERE REGEXP_LIKE(description, ‘electronics’, ‘i’); “`

주의사항 및 성능 고려사항

정규 표현식은 강력하지만, 복잡한 패턴은 성능 저하를 유발할 수 있습니다. 인덱스를 활용할 수 없는 경우도 많으므로 대용량 테이블에서는 신중하게 사용해야 합니다. 가능하면 간단한 패턴을 사용하고, 필요한 경우에만 복잡한 패턴을 사용하는 것이 좋습니다.

위로 스크롤