정규식 표현식이란 문자열의 일반화 규칙을 표현하는 방법으로, 오라클에서는 정규식 표현식 사용가능한 문자함수를 제공하고 있다( 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
나머지 필기를 기록한다.
(a|b) = [ab] → a또는b
대괄호 안에서는 -(하이픈)이 범위를 나타내는 의미를 가짐(물결과 같은)
[a-z] 숫자를 제외한 소문자의 한 자리를 나열
[a-z]+ 숫자를 제외한 소문자의 한 자리를 계속 나열
특수문자를 무력화하는 방법
(1) \.
(2) [.]
대괄호로 무력화 안되는 것: - 하이픈
[a-z-]: 그러나 이 예시 처럼 짝이 없는 하이픈이 일반 기호가 됨
복습후기
정규식 표현식 외울 것이 많긴 한데 잘 사용하면 크롤링 할때나 데이터 정리할 때 유용하게 쓸 수 있겠다.
오늘이 SQL 마지막 시간인 줄 알았는데 월요일에 조금 더 하시겠다고 하신다.
그럼 일단 이번주는 마감!
'배우기 > 복습노트[oracle sql]' 카테고리의 다른 글
[복습] SQL | Oracle 문자열의 규칙 찾기, 문자열의 일반화인 정규식 표현식(2) (0) | 2023.11.20 |
---|---|
[실습문제] 2023. 11. 17.(금) (2문제) (0) | 2023.11.20 |
[복습] SQL | Oracle GROUP BY 의 함수 종류(GROUPING SETS, ROLLUP, CUBE) (0) | 2023.11.17 |
[복습] SQL | Oracle 사용자 정책 만들기 PROFILE (0) | 2023.11.17 |
[복습] SQL | Oracle 계정 생성하기(USER) (2) 이어서 (0) | 2023.11.17 |