본문 바로가기

sqld

2-16) 정규 표현식

정규 표현식
  • 문자열의 공통된 규칙을 보다 일반화하여 표현하는 방법
  • 정규 표현식 사용 가능한 문자함수 제공 (REGEXP_REPLACE, REGEXP_SUBSTR, REGEXP_INSTR,...)
  • 예) 숫자를 포함하는, 숫자로 시작하는 4자리, 두 번째 자리가 A인 5글자 등 표현

 

예) 일반화 규칙 찾아내기

  • '숫자를 연속적으로 3개 이상 포함하는' 이라는 공통 패턴을 발견하여 표현할 수 있음

 

정규 표현식 종류

  • []는 안에 어떤 것이 들어가든 한 글자를 나타냄
  • ^a는 원래 'a로 시작하는'
  • [^a] 로 [] 안에 들어가면 a를 제외한 모든 문자를 나타냄
  • a{2} : aa

 

예) 전화번호의 일반화

  • 전화번호는 숫자와 -로 구성 : [0-9-]+ → (0-9- : 숫자 or -) (+ : 1개 이상)
  • tel 값은 동시에 있고 )가 있는 경우와 없는 경우를 모두 표현 : tel\)? → )를 표현하기 위해 \ 붙임

 

REGEXP_REPLACE
  • 정규식 표현을 사용한 문자열 치환

 

** 문법

REGEXP_REPLACE(대상, 찾을 문자열, [바꿀 문자열], [검색 위치], [발견 횟수], [옵션])

 

** 특징

  • 바꿀 문자열 생략 시 : 문자열 삭제
  • 검색 위치 생략 시 : 1
  • 발견 횟수 생략 시 : 0 (모두 치환/삭제)

** 옵션

  • c : 대소를 구분하여 검색
  • i : 대소를 구분하지 않고 검색
  • m : 패턴을 다중라인으로 선언 가능

 

예1) ID에서 숫자 삭제

  • \d , [:digit:] : 숫자
  • '' (빈문자열)로 설정하면 바꿀 문자열 없음 → 찾은 문자열 삭제

 

예2) ID에서 특수기호 삭제

  • '\W' : 특수기호 (_ 미포함)와 공백 ( ↔ '\w' : _를 포함한 문자와 숫자)
  • '\W|_' : _를 포함한 특수기호
  • [:funct:] : 특수기호

 

예3) PROFESSOR 테이블의 ID에서 문자와 문자 바로 뒤에 오는 숫자를 삭제 (대소구분 X)

  • REGEXP_REPLACE(ID, '[A-z][0-9]', '', 1, 0, 'i') 로 옵션까지 모두 설정하거나 뒤를 모두 기술하지 않고 기본값으로
  • '[A-z0-9]' 로 전달할 경우 문자와 숫자를 모두 삭제하므로 특수문자(-) 제외 모두 삭제됨

 

예4) kong-12에서 g-1을 지우는 방법 (문자-숫자 지우기)

 

 

예5) PRODUCT 테이블의 상품명에서 괄호 포함, 괄호 안에 들어가는 모든 글자를 삭제

 

테이블 데이터)

  • 괄호를 표현하기 위해서는 \(로 전달

 

예6) REGEXP_REPLACE를 사용하여 두 번째 발견된 문자 값을 X로 치환

 

 

REGEXP_SUBSTR
  • 정규식 표현식을 사용한 문자열 추출
  • 옵션은 REGEXP_REPLACE와 동일

 

** 문법

REGEXP_SUBSTR(대상, 패턴, [검색 위치], [발견 횟수], [옵션], [추출 그룹])

 

** 특징

  • 검색 위치 생략 시 : 1
  • 발견 횟수 생략 시 : 1 (첫 번째 발견된 문자열 추출)
  • 추출 그룹은 서브 패턴을 추출 시 그 중 추출할 서브패턴 번호

 

예1) 전화번호를 분리하여 지역번호 추출

  • 숫자여러개 + ) + 숫자여러개 + - + 숫자여러개
  • \d+, \), \d+, -, \d+
  • ()로 그룹 나눠 첫 번째 그룹 추출

 

예2) 이메일 아이디 추출 (서브패턴 활용)

 

 

REGEXP_INSTR
  • 주어진 문자열에서 특정 패턴의 시작 위치를 반환
  • 옵션은 REGEXP_SUBSTR과 동일

 

** 문법

REGEXP_INSTR(원본, 찾을 문자열, [시작 위치], [발견 횟수], [옵션])

 

** 특징

  • 시작 위치 생략 시 : 1 (처음부터)
  • 발견 횟수 생략 시 : 1 (처음 발견된 문자열 위치 리턴)

 

예1) ID 값에서 두 번째 발견된 숫자의 위치

  • \d 는 뒤에 횟수를 지정하지 않으면 한 자리 수의 숫자를 의미

 

예2) 정규식 표현식을 사용한 패턴에 일치하는 n 번째 문자열 위치

  • [^ ] : 공백을 제외한 모든 문자
  • [^ ]+ 공백을 제외한 모든 문자가 1개 이상 → 단어
  • 2 번째 단어 찾기 → ORACLE → 시작 위치 : 5

 

REGEXP_LIKE
  • 주어진 문자열에서 특정 패턴을 갖는 경우 반환
  • WHERE 절에서만 사용 가능
  • 옵션은 REGEXP_REPLACE와 동일

 

** 문법

REGEXP_LIKE(원본, 찾을 문자열, [옵션])

 

예) ID 값이 숫자로 끝나는 교수 정보 출력

 

 

REGEXP_COUNT
  • 주어진 문자열에서 특정 패턴의 횟수를 반환
  • 옵션은 REGEXP_REPLACE와 동일

 

** 문법

REGEXP_COUNT(대상, 찾을 문자열, [옵션])

 

예) ID 값에서의 숫자의 수

  • \d는 한 자리 수의 숫자, \d+는 연속적인 숫자를 의미
  • \d+로 전달 시 연속적인 숫자를 1개로 취급

 

 

 

 

'sqld' 카테고리의 다른 글

2-18) TCL  (0) 2024.08.23
2-17) DML  (0) 2024.08.23
2-15) PIVOT과 UNPIVOT  (0) 2024.08.22
2-14) 계층형 질의  (0) 2024.08.22
2-13) TOP N QUERY  (0) 2024.08.22