Continuous Challenge

[불친절한 SQL 프로그래밍] [24장] 정규 표현식(1) (feat. REGEXP_SUBSTR) 본문

Study/불친절한 SQL 프로그래밍

[불친절한 SQL 프로그래밍] [24장] 정규 표현식(1) (feat. REGEXP_SUBSTR)

응굥 2019. 12. 18. 14:33
728x90
728x90

744P

 

정규 표현식

정규 표현식은 문자열의 규칙을 표현하는 검색 패턴으로 주로 문자열 검색과 치환에 사용된다. 

 

24.1.1.1 기본 연산자

 

연산자 영문 설명
. dot 모든 문자와 일치 (newline 제외)
| or 대체 문자를 구분
\ backslach 다음 문자를 일반 문자로 처리

c1,c2,c3,c4 열의 dot연산자는 각각 a,b,c,d 문자와 일치한다. c4열은 세 번째 문자인 c가 패턴의 세 번째 문자인 b와 일치하지 않기 때문에 널을 반환한다.
c3열의 c는 a 또는 b와 일치하지 않고, c6열의 bc는 ab 또는 cd와 일치하지 않기 떄문에 널을 반환한다. or연산자는 기술 순서에 따라 패턴을 일치시킨다. c7열은 a, c8열은 aa가 일치한다.

 

24.1.1.2 앵커

앵커(anchor)는 검색 패턴의 시작과 끝을 지정한다. 

연산자 영문 단일 행 방식 다중 행 방식
^ carrot 문자열의 시작 행의 시작
$ dollar 문자열의 끝 행의 끝

CHR(10) 표현식은 개행(line feed)문자를 반환한다. c1, c2, c3, c4열은 모두 문자열의 첫번째 자리부터 검색을 수행한다. c1, c2열은 단일 행 방식으로 동작한다. c1열은 전제 문자열의 시작 문자인 a, c2열은 전체 문자열의 두 번째 시작 문자가 존재하지 않으므로 널을 반환한다. c3열과 c4열은 REGEXP_SUBSTR 함수의 일치 옵션에 m을 기술하여 다중 행 방식으로 동작한다. c3열은 첫째 줄의 시작문자인 a, c4열은 둘째 줄의 시작문자인 c를 반환한다.
c1열은 전체 문자열의 끝 문자인 d, c2열은 전체 문자열의 두 번째 끝 문자가 존재하지 않기 때문에 널, c3열은 첫째 줄의 끝 문자인 b, c4열은 둘째 줄의 끝 문자인 d를 반환한다. 

 

24.1.1.3 수량사

수량사(quantifier)는 선행 표현식의 일치 횟수를 지정한다. 패턴을 최대로 일치시키는 탐욕적(greedy) 방식으로 동작한다.

연산자 설명
? 0회 또는 1회 일치
* 0회 또는 그 이상의 횟수로 일치
+ 1회 또는 그 이상의 횟수로 일치
{m} m회 일치
{m, } 최소 m회 일치
{, m} 최대 m회 일치
{m, n} 최소 m회, 최대 n회 일치

c3열은 b가 0회 또는 1회 일치해야 하기 때문에 널을 반환한다. 
c5열은 a가 최소 4회, 최대 5회 일치해야 하기 때문에 널을 반환한다.

 

24.1.1.4 서브 표현식

서브 표현식(subexpression)은 표현식을 소괄호로 묶은 표현식이다.

연산자 설명
(expr) 괄호 안의 표현식을 하나의 단위로 취급

c1열은 ab, c2열은 b가 1회 이상 반복된다. c3열은 b 또는 c, c4열은 ab 또는 cd가 대체된다.

 

24.1.1.5 역참조

역 참조(back reference)를 사용하면 일치한 서브 표현식을 다시 참조할 수 있다. 반복되는 패턴을 검색하거나 서브 표현식의 위치를 변경하는 용도로 사용할 수 있다.

연산자 설명
\n n번째 서브 표현식과 일치, n은 1에서 9 사이의 정수

c1,c2,c3열의 패턴은 abxab, cdxcd 문자열과 일치한다. c4,c5,c6열은 동일한 문자열이 1회이상 반복되는 패턴을 검색한다.

 

24.1.1.6 문자 리스트

문자 리스트(character list)는 문자를 대괄호로 묶은 표현식이다. 문자 리스트 중 1문자만 일치하면 패턴이 일치한 것으로 처리된다. 문자 리스트에서 하이픈(-)은 범위 연산자로 동작한다.

연산자 설명
[char...] 문자 리스트 중 1문자와 일치
[^char...] 문자 리스트에 포함되지 않은 한 문자와 일치

c1, c2, c3열의 패턴은 ac, bc문자열과 일치한다. c4, c5, c6열의 패턴은 ac, bc가 아닌 문자열과 일치한다.
문자리스트의 범위 연산자를 사용한 쿼리. c4열은 첫 번째 문자는 숫자가 아닌 문자 두 번째 문자는 소문자가 아닌 문자와 일치해야 하기 때문에 널을 반환한다.

 

24.1.1.7 POSIX 문자 클래스

오라클 정규 표현식은 POSIX 문자 클래스를 지원한다. POSIX 문자 클래스는 문자 리스트에 사용해야 한다.

문자 클래스 설명 동일
[:digit:] 숫자 [0-9]
[:lower:] 소문자 [a-z]
[:upper:] 대문자 [A-Z]
[:alpha:] 영문자 [a-zA-Z]
[:alnum:] 영문자와 숫자 [0-9a-zA-Z]
[:xdigit:] 16진수 [0-9a-fA-F]
[:punct:] 구두점 기호 [^[:alnum:][:cntrl:]]
[:blank:] 공백 문자  
[:space:] 공간 문자(space, enter, tab)  
[:cntrl:] 제어 문자(아스키 < 32, 아스키 > 126)  
[:print:] 출력이 가능한 모든 문자 (아스키 32 ~ 126)  
[:graph:] [:print:]에서 space 제외  

POSIX 문자 클래스를 사용한 쿼리. c7열은 [:punct:] 클래스를 사용하여 특수 문자를 검색한다.

 

CHR(9) 표현식은 탭문자를 반환한다. [:blank:] 클래스에 탭이 포함되어 있지 않기 때문에 c2 열은 널을 반환한다.
c2열에서 [:print:] 클래스에 공백 문자가 포함된 것을 확인할 수 있다.

728x90
728x90
Comments