본문 바로가기

배우기/복습노트[oracle sql]

[복습] SQL | Oracle 문자열의 규칙 찾기, 문자열의 일반화인 정규식 표현식 + 복습후기(20231117)

728x90
반응형

정규식 표현식이란 문자열의 일반화 규칙을 표현하는 방법으로, 오라클에서는 정규식 표현식 사용가능한 문자함수를 제공하고 있다( REGEXP_REPLACE, REGEXP_SUBSTR, REGEXP_INSTR,... 이런 식으로)

 

정규식 표현식의 종류

1) 데이터 타입 관련

\d: 숫자

\w: (공백을 제외한)글자(문자와 숫자)  → 여기서는 언더바(_)까지 포함한다.

\W: 글자가 아닌 공백과 특수기호  → 여기서는 (_)언더바를 제외한다.

\s: 한글자 이상의 공백(그러므로 탭도 포함됨)

[[:alpha:]]: 글자
[[:digit:]]: 숫자
[[:alnum:]]: 글자(문자+숫자)
[[:punct:]]: 특수기호

 

2) 한 글자의 특수기호 형태 ★

^: 시작  예를 들어 ^a\w+ 하면 a로 시작하는 단어들이 출력된다

$: 끝    

| : 또는   예를 들어 (a|b) 하면 a 또는 b 이다.

. : 엔터를 제외한 한 글자(한 칸의 공백, 한 칸의 숫자, 한 칸의 문자, 한 칸의 특수기호 모두 포함)

+: 1회 이상 반복

*: 0회 이상 반복 (? 과 구분하지 않는다)

?: 0회 이상 반복 최대 1회 반복

여기서 ? 가 왜 필요할까? ?는 있어도 되고 없어도 될 때 필요하다.

만일 추출하려는 자료가 

tel)02-999-4456  

tel02-999-4456 

가 있을 수도 있기 때문이다. 이 때 ) 가 있을 수도 있고 없을 수도 있기 때문에 사용한다.

 

여기서 .+ 가 의미하는 것이 있다.

 

이렇게 되면 전화번호만 추출하려는게 아니라 뒤의 상호명까지 쭉 나오게 된다.  .+는 엔터를 만나기 전까지 다 추출하기 때문이다.

또 전화번호가 tel02-999-4456 이 있을 수도 있다. 이러한 것들을 모두 추출하려면 ?를 쓰면 된다.

이렇게 추출할 수 있다. 

다만 뒤에 다른 상호명이 등등이 없다는 가정 하에...!

 

02)355-1782 표현하기 : \d+\)\d+-\d+ 이렇게 하면 무조건 전화번호 뽑힘
근데 031-4444-1111 이건 안뽑히는데, 이거까지 포함하려면 \d+(\)|-)\d+-\d+ 를 쓰면 된다.

참고로 문자를 구분하기 위하여 공백을 넣을 수도 있는데 공백을 넣게 되면 공백의 패턴까지 읽게 되므로 추출이 불가하다.

 

 

a로 시작하는 단어를 지워보자

 

 

위 아래 차이를 비교하여보자.

. 하나 차이로 결과가 다르게 나타난다.

 

{n,m} n회 이상 m회 이하
예) 02-356-7777
031)4444-8888
031 4444-8888
02 356-7777
\d{2,3} 숫자가 2회 또는 3회까지 반복(국번)
\d{3,4} 가운데 번호가 3회이상 4회이하 반복

 

(): 그룹 지정(서브패턴 추출하거나 특정 표현 우선 파싱)
\ : 이스케이프 문자로 뒤에 오는 정규식 표현을 무시(일반 문자화)
[] : 한 글자로 표현되는 문자를 정의
 예) [0-9]: 숫자
     [a-z]: 소문자
       [abc]: a또는 b또는 c

 

 

1. regexp_replace(대상, 찾을문자열, 바꿀문자열, ...)
예)  PROFESSOR 테이블에서 ID에서 숫자 삭제

 

 

특수기호를 삭제하여보자

 

 

다음 예제를 풀어보자.

PRICE 테이블에서 머거본꿀땅콩(130g)에서 130g이 지워진 상품명을 출력하여라.

 

 

2.regexp_substr(대상, 패턴, ....);

아래 테이블을 생성 후 전화번호를 추출하여라.

이런 식으로 데이터를 넣었다. 화면에서는 잘렸지만.....ㅎ

 

 

이렇게 출력하였다.

그렇다면 대표자를 출력하려면 어떻게 해야할까.

 

 

LINE 4 옵션은 선생님만 테스트 하셨는데 한번 찾아보았다.

REGEXP_SUBSTR(문자, 패턴, 검색시작위치, 패턴일치횟수, 일치옵션, 서브표현식)

일치옵션은 i 인 경우 대소문자 구별을 하지 않고 c 인경우는 대소문자 구별한다. 선생님은 null이라고 쓰셨다.

맨 뒤가 서브표현식인데, 0은 전체 패턴, 1이상은 서브표현식이라고 한다. 서브표현식이 뭔가..

아 이렇게 보니까 이해가 간다.

 

아래 블로그를 참고하여 테스트하였다.

https://developer-ek.tistory.com/40

 

[불친절한 SQL 프로그래밍] [24장] 정규 표현식(2) (REGEXP_LIKE, REGEXP_REPLACE, REGEXP_SUBSTR, REGEXP_INSTR, REGEXP

756P REGEXP_LIKE 조건 REGEXP_LIKE 조건은 source_char가 pattern과 일치하면 TRUE, 일치하지 않으면 FALSE를 반환한다. REGEXP_LIKE(source_char, pattern [, match_param]) 매개변수 설명 source_char 검색 문자열 pattern 검색 패

developer-ek.tistory.com

 

나머지 필기를 기록한다.

 

(a|b) = [ab]  →  a또는b
대괄호 안에서는 -(하이픈)이 범위를 나타내는 의미를 가짐(물결과 같은)

[a-z]    숫자를 제외한 소문자의 한 자리를 나열
[a-z]+ 숫자를 제외한 소문자의 한 자리를 계속 나열

특수문자를 무력화하는 방법 
(1) \.
(2) [.]
대괄호로 무력화 안되는 것: - 하이픈
[a-z-]: 그러나 이 예시 처럼 짝이 없는 하이픈이 일반 기호가 됨

 

 

복습후기

정규식 표현식 외울 것이 많긴 한데 잘 사용하면 크롤링 할때나 데이터 정리할 때 유용하게 쓸 수 있겠다.

오늘이 SQL 마지막 시간인 줄 알았는데 월요일에 조금 더 하시겠다고 하신다.

그럼 일단 이번주는 마감!

728x90
반응형