SQL

오라클 데이터베이스 SQL(3) - 정규식 패턴 비교(전화번호/문자열

김랑해 2023. 7. 27. 15:33

저번시간에 _와 %의 사용법에 대해서 배웠었다

WHERE NAME = '박%' > 앞자리가 박인 무언가

WHERE NAME LIKE '_박_' > 가운데에 박이 들어가는 세글자 단어

 

정규식 패턴 비교(숫자열 비교)

게시글 데이터에서 제목에 전화번호가 들어가는 코드를 짜보자

SELECT*FROM NOTICE WHERE TITLE LIKE '%-%-%';

전화번호는 출력되지만 '선반 - 접시 - 그릇' 이라는 제목도 같이 출력된다

 

010-2222-3333

016-234-4353

017-444-5555

018-123-2345

019-232-2345

...

거기다 전화번호 유형은 다양하과(과거에는) 자리수도 고정되어있지 않았다

 

'%-%-%' 부분을

01[016789] - [0123456789][0123456789][][] - [][][][]...

 

너무 많다.... 

 

연속되는 숫자를 - 로 처리하면 되니까

01[016-9]-[0-9][0-9]...

 

그래도 많다

 

\d = [0-9] 이니까

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

 

하지만 더 간단하게 하자면?

01[016-9]-\d{3,4}-\d{4} 

{3,4} = \d가 3개 혹은 4개 라는 의미

 

근데 regular exression의 중요한 것은 바로

^ ~ $

패턴 시작과 끝을 한정하는 표현

<akdlfjael 010-8888-9885 ㅁ이라멍>  이러면 출력이 안된다는 것

이것이 포함되는 걸 찾고싶다 하면 ^ ~ $ 빼고 사용

 

SELECT * FROM WHERE REGEXP_LIKE

(컬럼, '패턴')

 

 

 

전화번호 말고 다른 것도 껴있다면?

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

전화번호만 있다면?

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

 

 

정리

1. 특정자리에 오는 값이 0부터 9라면 [0123456789]라고 쓸 수 있다

2. 연속되는 수라면 '-'를 이용하여 줄일 수 있다 [0123456789] = [0-9]

3. regular expression을 이용해 digital숫자를 줄일 수 있다 [0-9] = \d

4. 반복되는 표현은 {반복횟수}로 줄일 수 있다 \d\d\d\d = \d{4}

5. regular expression은 오라클 내장이 아니므로 WHERE REGEXP_LIKE()를 이용해야 한다

 

정규식 패턴 관련 사이트

https://regexlib.com/CheatSheet.aspx

 

RegExLib.com Regular Expression Cheat Sheet (.NET Framework)

\p{name}Matches any character in the named character class specified by {name}. Supported names are Unicode groups and block ranges. For example, Ll, Nd, Z, IsGreek, IsBoxDrawing.

regexlib.com

1) search를 통해 관련 식 찾을 수 있음 ex) 이메일

2) regex cheat sheet 에 들어가서 참조할 것

 

 

 

정규식 패턴 비교(문자열 비교)

게시글 데이터에서 이메일이 들어가는 걸 추출하는 코드를 짜보자

 

이메일의 기본적인 구조

newlec@nana.com org net

 

[0-9a-zA-Z]

..인데 더럽다 영문자 하나를 표현할 수 있는 정규식이 없을까?

이걸로 [0-9a-zA-Z] -> \w 로 대체할 수 있게 되었다

하지만 이메일 글자는 한글자부터 ~ 너무 많은걸?

 

* 는 해당 내용이 0이상

+ 는 해당 내용이 1이상

 

\w+@\w+

하지만 11newlec@11nana.com 이런 것도 같이 출력된단 말이다... 시작이 숫자가 되면 안됨

보면 \D는 [^0-9] 0-9를 제외한 문자 한글자를 의미하는 것 (\d 와는 반대)

 

\D\w*@\D\w*

이렇게 하면 숫자가 아닌 문자 1글자로 시작 ~

 

이제 뒤에 com org net 중 하나 올 값을 설정해보자

.[com org net]

은 각 철자 하나하나를 쪼개서 인식하게 됨

 

.(com | org | net)

로 하면 단어 하나하나로 인식

\D\w*@\D\w*.(org|net|com)

 

 

https://youtu.be/X0pTLNeZ0UM

이걸로 공부하는 중입니다