Programming/SQL

정규식 패턴 + 특수문자가 포함된 칼럼 검색 2021-07-28

최동훈1 2021. 7. 28. 16:25
select * from member where REGEXP_LIKE(email,'\w+@\w+.(com|org|net)');

우선 내가 저번에 저장한 member 테이블에서 전화번호를 검색한다고 하자.

검색 대상이 되는 테이블 들.

우선 이전 포스트에서 설명한 단순 패턴비교 연산으로도 검색이 가능하다.

select *from member where phone like '%-%-%';

이렇게 말이다. 그런데 이럼 문제가 있다. 범위가 너무 넓다는 것이다. %는 숫자 문자, 영어 등 모든 문자를 포함한 값이 올수 있다는 것인데, 숫자뿐 아니라 김치-바나나-학성고 등의 문자열도 검색되버릴수 있다는 것이다. 그래서 우리는 좀더 정교한 검색을 위해 정규식을 사용할 수 있다. 우선 [ ] 연산자는 1자리를 나타낸다. 예를들면.

select * from member where REGEXP_LIKE(phone,'01[0-9]-\d{4}-\d{4}');
--[0-9] 와 \d는 같은 의미이다.

이렇게 일반적인 전화번호를 나타낼 수 있다.  그런데 { } 이 괄호는 바로 앞에 있는 문자의 똑같은 반복이다. 자리수는 바로 앞에 있는 문자를 제외한다. 즉 4면 0부터 9까지의 수가 4자리 올수 있다는 뜻이다.

 

이메일도 알아보자면, 우선 [0-9] 와 동일시되는 정규식이 \d 였다면 마찬가지로 이메일은 문자 숫자 다 올수 있으므로, [0-9a-zA-Z]와 동일시 되는 정규식을 찾아야 한다. 바로 \w이다. 여기서 \d 와 \D , \w와 \W 의 차이를 궁금할 수 있는데 이것은 그냥 ^(not)연산자의 차이이다. 즉 \D는 숫자를 제외한 모든 문자 이고, \W는 영어, 숫자를 제외한 모든 문자이다.

select * from member where REGEXP_LIKE(email,'\w+@\w+.(org|net|com)');

이러면 이메일 형식으로 검색이 가능하다. 그런데 난 또 의문이 들었다. 그럼 . 자체는 "아무 문자 1개가 올수있음" 을 나타내는 정규식 표현인데 막상 문자열 그대로 "." 를 검색할려면 어떻게 해야 할까? 자바에서 특수문자를 표현할때 역슬레시를 쓰는 것 처럼 여기도 그러면 되지 않을까? 라는 생각을 하였고 테스트를 해 보았다.

우선 맨 위 테이블 처럼 테이블의 name 칼럼에 "최동훈" 과 "최.훈"을 넣어서 아래의 쿼리의 결과를 비교해 보았다.

select * from member where REGEXP_LIKE(naem, '최.훈');

 결과

아무 문자 1개를 뜻하는 정규식 패턴 '.' 의 의미에 맞게 모든 테이블이 출력되었다.

select * from member where REGEXP_LIKE(name,'최\.훈');

결과

정말 최"."훈 이라고 이름붙여진 테이블만 출력되었다. 

이것을 통해 내 가설이 맞았다.ㅎㅎ 자바처럼 특수문자를 어떤 형식에 표현할때는 역슬레시를 붙여주면 된다. 그렇지 않으면, 그 특수문자가 기능하는 표현법으로 컴퓨터가 인식한다.

 

그래서 위 이메일 검색도

select * from member where REGEXP_LIKE(email,'\w+@\w+\.(org|net|com)');

이게 맞는 표현이다. \.는 정규식 표현 . 이 아니라 문자열 그대로의 . 을 의미하므로.

 

공부시간 1시간 30분.

순공부시간 40분.

 

오늘 오전에 또 어르신 모시고 병원 간다고 오전공부를 못했다. 그리고 오후에도 한번 한 내용을 다시 직접 프로그래밍 을 하면서 복습하니 조금 물린다..ㅎㅎㅎ 그래도 조금만 더 하면 기존 공부한 내용은 다 끝내고 새로운 진도를 나갈수 있으니 조금만 참자 !!. 그리고 나름의 기준을 세웠는데 하루에 이론공부는 최소 30분을 하기로 마음먹었다. 즉, 30분 공부 + 20분 직접코딩 + 알고리즘 문제풀이 1시간 이상. 이렇게 루틴을 짜면 될거 같다.