티스토리 뷰

Goal

 - 정규식에 대해 알아본다

 - 정규식을 통해 숫자와 문자열 패턴을 비교해본다.

1. 정규식이란? 

 - 1950년대 부터, Unix머신에서 텍스트를 검색하기 위해 사용

 - 최근에는 다양한 언어 및 플랫폼에서 사용되고 있음

 ex) (?<=\.) {2,} {?=[A-Z])

 - 오라클에서 기본적으로 제공하는 연산자들로 나타낼 수 없는 패턴을 연산하기 위해 주로 사용

2. 정규식으로 전화번호 패턴 연산하기

 - TEST라는 테이블에 다음과 같이 데이터가 들어있다.

 - TEST 테이블의 TITLE 속성의 값중에 전화번호(xxx-xxxx-xxxx)를 갖고 있는 데이터들만 조회하고 싶을 때 어떻게 쿼리를 작성해야 할까?

 

 1) 패턴 연산자를 통한 검색

 - 패턴 연산자를 사용하여 %-%-%와 같이 숫자 사이에 2개의 하이픈을 갖고있는 자료를 검색하도록 쿼리를 날릴 수 있다.

 ex) SELECT * FROM TEST WHERE TITILE LIKE ('%-%-%'); 

 - 하지만 위와 같이 쿼리를 작성하면 %-%-% 패턴을 갖는 모든 데이터 자료가 선택되기 때문에 3행의 짜장-짬뽕-탕수육 ~ 을 값으로 같는 데이터로 같이 조회된다.

%-%-%의 결과

 

그렇다면 어떻게 해야할까? 먼저 전화번호를 검색하기 위한 조건을 생각해보자.

 

전화번호를 검색하기 위해서는

 010-xxxx-xxxx

 011-xxxx-xxxx

 010-xxxx-xxxx

 위과 같이 하이픈(-) 양 옆에는 숫자만 나와야 하고, '0으로 시작하는 3자리 숫자 - 4자리 숫자 - 4자리 숫자'의 패턴을 만들어야 한다. 자릿수를 제한하거나, 유의한 값들이 연속적으로 오게끔하는 정교한 연산에는 오라클 기본연산자로 한계가 있기 때문에 정규식을 이용한다.

 

 2) 정규식을 통한 패턴 비교

 - [] : 정규식에서 대괄호를 쓰면 대괄호가 하나의 글자를 대변한다.

 ex) 01[016789] : 대괄호 안에 숫자를 넣어주면, 각 숫자들에 해당하는 값을 한 글자로하여 인식할 수 있게 해준다. 예를 들어 01[016789]와 같이 정의했다면 010, 016, 017, 018, 019를 인식할 수 있게 된다.

 - [0-9] : 대괄호 안에 숫자를 하나하나 기입하는 것보다 범위를 나타낼 수 있도록 하이픈을 이용하는게 효율적이다.

 ex) 01[016-9]-[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]

 - \(역슬래시)d : 대괄호를 통해 위와 같이 전화번호를 인식할 수 있는 패턴을 만들었지만 [0-9]라는 표현이 계속 중복되는 것을 확인할 수 있다. 따라서 [0-9]를 나타내는 \d를 사용하여 식을 간편히 나타낸다.

 ex) 01[016-9]-\d\d\d\d-\d\d\d\d

 - {4} : \d도 연속적으로 나열되기 때문에 반복적인 수를 효과적으로 표현할 수 있는 정규식을 적용한다.

 ex) 01[016-9]-\d{3, 4}-\d{4} : \d를 4번 반복한다는 {4}표현을 사용하고, 가운데 전화번호에는 3글자 또는 4글자가 올 수 있기 때문에 {3, 4}를 이용하여 최종적으로 전화번호 패턴을 정규식을 통해 깔끔하게 만들었다.

 

3) 정규식 사용하기

 - 정규식은 Oracle에서 제공하고 있는 패턴 문자열이 아니기 때문에 LIKE절로 사용할 수 없다.

 - WHERE REGEXP_LIKE(first_name, '정규식 표현') : WHERE 절과 함께 REGEXP_LIKE라는 함수를 사용하여 속성의 이름과 정규식 표현을 통해 데이터를 검색한다.

 ex) 제목에 전화번호가 포함된 게시글을 조회하시오. 

  - SELECT * FROM NOTICE WHERE REGEXP_LIKE(TITLE, '^01[016-9]-\d{3,4}-\d{4}$');

  * ^와 & : 정규 표현식의 시작과 끝을 의미하는 기호 : 해당 기호를 앞과 뒤에 넣으면 그 정규식으로 만 끝나는 자료를 검색하기 때문에 범위가 좁혀진다.

  - SELECT * FROM NOTICE WHERE REGEXP_LIKE(TITLE, '01[016-9]-\d{3,4}-\d{4}');

  - ^, & 없이 정규식을 쓰면 전화번호가 포함된 게시글을 조회한다.

3. 문자열 비교를 위한 정규식 (^\D\w+@...)

 - 일반적으로 문자열 비교를 위한 정규식에는 이메일을 비교하기 위해 많이 사용한다.

 

1) 문자열 비교 정규식을 통해 이메일 표현하기

 - \w : 소문자 a-z, 대문자 A-Z, 숫자 0-9까지를 문자로 사용할 수 있는 [a-zA-Z_0-9]식과 동등한 표현

 - *, +, ? : 기호 뒤에 *, +, ?를 이어 쓰게 되면 순차적으로 어떤 자료가 0개 이상, 1개 이상, 0또는 1개가 온다는 것을 의미한다.

 ex) \w+@\w+ : [a-zA-Z_0-9]로 표현할 수 있는 문자(\w)가 1개 이상(+)오고 그 다음에 @이가 나오며 다시 [a-zA-Z_0-9]로 표현할 수 있는 문자(\w)가 1개 이상(+)나온다. 즉 해당 표현으로 newlec@korea를 표현할 수 있다.

 - | : 이메일을 표현하기 위해서는 com, org, net을 많이 이용하는데 각각의 자료를 베타적으로 사용할 수 있도록 or을 표현하는 | (alternation)을 사용한다. ex) \w+@\w+.(org|net|com)

 

\w+@\w+.(org|net|com)과 같은 정규식 표현을 통해 이메일을 인식할 수 있게 됐다. 하지만 여기서 문제가 있는데 해당 정규식 표현은 11newlec@11korea.com과 같이 이메일 형식에 맞지 않는 숫자로 시작하는 문자들도(11korea.com) 인식하게 된다.

 

- \D : 숫자가 아닌 문자들만 올 수 있도록 하는 [^0-9]와 같은 표현의 정규식, \d는 반대로 [0-9]를 의미. 도메인네임이 숫자로 시작하는 것을 막기 위해 \w*@\D\w*.(org|net|com)와 같이 사용한다.

 

최종 정규표현식 \w*@\D\w*.(org|net|com)을 통해 이메일형식에 해당하는 데이터를 추출할 수 있다.

 

* Regular Expression Library

 - 다양한 정규식의 표현을 모아놓은 라이브러리 사이트.

 - 사용자가 만들 정규식을 검색할 수 있으며, 자신이 만든 정규식을 테스트 할 수 있는 기능도 있다.

( http://regexlib.com/?AspxAutoDetectCookieSupport=1 )

 

'DataBase > 오라클 SQL' 카테고리의 다른 글

DISTINCT (Oracle SQL) + 단원 정리  (0) 2020.05.03
ROWNUM (Oracle DataBase)  (0) 2020.05.03
연산을 통한 데이터 조회  (0) 2020.04.28
트랜잭션 (DATA BASE)  (0) 2020.04.27
데이터 조작하기 DML  (0) 2020.04.27
댓글