오라클 데이터베이스 SQL(3) - 정규식 패턴 비교(전화번호/문자열
저번시간에 _와 %의 사용법에 대해서 배웠었다
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)
이걸로 공부하는 중입니다