일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 연산자메서드
- 파이썬 #python #class #클래스 #상속
- docker
- redis
- 파이썬 #python #file #i/o #input #output
- 파이썬 #python #filter #map #reduce
- aw3
- 프로그래머스
- aws
- 파이썬 #python #예외처리 #exception
- 파이썬 #python #os #os.path #glob
- 사용자정의예외
- 파이썬 #python #Comprehension
- 민감 정보 관리
- EC2
- 파이썬 #python #함수 #function
- 파이썬 #python #가변매개변수 #키워드가변매개변수 #args #kwargs
- 파이썬 #python #전역변수 #지역변수 #eval
- spring boot
- Git
- PostgreSQL
- 파이썬 #python #모듈 #module #import #random #time #calendar #sys
- 파이썬 #python #지역함수
- 파이썬 #python #lambda #람다
- 배포
- 파이썬 #python #docstring
- jsonb
- 파이썬 #python #enumerate
- 약수 수하기
- 파이썬기본문법 #파이썬 #python
- Today
- Total
Yeonnnnny
[2과목] 2-16. 정규 표현식 본문
■ 정규 표현식
- 문자열의 공통된 규칙을 보다 일반화하여 표현하는 방법
- 정규 표현식 사용 가능한 문자함수 제공(regexp_replace, regexp_substr, regexp_instr, ...)
- ex) 숫자를 포함하는, 숫자로 시작하는 4자리, 두 번째 자리가 A인 5글자
■ 정규표현식 종류
ex) 전화번호의 일반화
▷ 전화번호는 숫자와 -으로 구성 -> [0-9-]+ 로 표현 가능([] 안에 들어가는 패턴이 한자리의 문자열을 구성할 수 있는 값들)
▷ 두 번호가 tel값은 동시에 있지만, )가 있는 경우와 없는 경우를 모두 표현 -> ?사용 (?는 값이 없거나 1개 있음을 의미)
■ REGEXP_REPLACE
: 정규표현식을 사용한 문자열 치환 가능
** 문법
(대상, 찾을 문자열, [바꿀 문자열], [검색 위치], [발견 횟수], [옵션])
- 특징
- 바꿀 문자열 생략 시 문자열 삭제
- 검색 위치 생략 시 1
- 발견횟수 생략 시 0 (모든)
- 옵션
- c : 대소를 구분하여 검색
- i : 대소를 구분하지 않고 검색
- m : 패턴을 다중라인으로 선언 가능
ex1) ID에서 숫자 삭제
select id, regexp_replace(id,'\d',''), regexp_replace(id,'[[:digit:]]','')
from professor;
▷ 빈 문자열을 전달하여 숫자를 모두 삭제 처리
ex2) ID에서 특수 기호 삭제
select ID, regexp_replace(id, '[[:punct:]]','') as result1,
regexp_replace(id,'\W|_','') as result2, regexp_replace(id, '\W','') as result3
from professor;
▷ \w는 문자와 숫자, _ 를 포함. \W는 \w의 반대 집합이므로 문자와 숫자와 _가 아닌 특수기호와 공백을 의미
ex3) PROFESSOR 테이블의 ID에서 문자와 문자 바로 뒤에 오는 숫자를 삭제 (대소 구분 X)
select id, regexp_replace(id, '[a-z][0-9]') as 성공1,
regexp_replace(id, '[a-zA-Z][0-9]') as 성공2,
regexp_replace(id, '[A-z][0-9]') as 성공3,
regexp_replace(id, '[A-z0-9]') as 실패1,
regexp_replace(id, '[a-z][0-9]','',1,0,i) as 성공4
from professor;
** kong-12 에서 g-1을 지우는 방법
select id,
regexp_replace(id, '[A-z]-[0-9]') as 성공1
regexp_replace(id, '[A-z](-|_)[0-9]') as 성공2
from professor;
ex4) product 테이블의 상품명에서 괄호 포함, 괄호 안에 들어가는 모든 글자를 삭제
select distinct regxep_replace(상품명, '\(.+\)','')
from product;
▷ 괄호는 서브그룹을 만드는 정규 표현식이므로 일반 괄호를 표현하기 위해서는 \) 로 전달해야 함
▷ \(.+\) : () 안에 엔터를 제외한 모든 값 허용 (. : 엔터를 제외한 모든 한 글자, i+ : i가 1회이상)
ex5) regexp_replace를 사용하여 두 번째 발견된 문자값을 X로 치환
select name, regexp_replace(name,'[[:alpha:]]','') as result1,
regexp_replace(name,'[[:alpha:]]','',1,1) as result2,
regexp_replace(name,'[[:alpha:]]','X',1,2) as result3
from student;
▷ 문자 삭제 시 찾고자하는 시작 위치와 발견 횟수를 전달할 수 있음
▷ result3 : 처음부터 스캔하여 두 번째로발견되는 문자를 X로 치환(마스킹 처리)
■ REGEXP_SUBSTR
- 정규 표현식을 사용한 문자열 추출
- 옵션은 REGEXP_SUBSTR과 동일
** 문법
regexp_substr(대상, 패턴, [검색위치],[발견횟수],[옵션],[추출그룹])
** 특징
- 검색위치 생략 시 1
- 발견횟수 생략 시 1
- 추출그룹은 서브패턴을 추출 시 그 중 추출할 서브패턴 번호
ex1) 전화번호를 분리하여 지역번호 추출
select tel, regexp_substr(tel, '(\d+)\)(\d+)-(\d+)', 1, 1, null, 1) as 지역번호
from student;
▷ 전화번호 구성 : 숫자 여러개 + ) +숫자 여러개 + - + 숫자 여러개
▷ 차례대로 \d+, \) , \d+, -, \d+ 로 표현 가능, 그 중 첫 번째 그룹을 추출
ex2) 이메일 아이디 추출(서브패턴 활용)
select email, regexp_substr(email, '(.+)@.+',1,1 null, 1) as email_id,
regexp_substr(email, '((\w|\W)+)@[a-z.]+',1,1 null, 1) as email_id2
from professor;
■ REGEXP_INSTR
- 주어진 문자열에서 특정 패턴의 시작 위치 반환
** 문법
regexp_instr(원본, 찾을 문자열, [시작위치],[발견횟수])
** 특징
- 시작위치 생략 시 처음부터 확인(기본값)
- 발견횟수 생략 시 처음부터 발견된 위치 리턴
ex) id 값에서두 번째 발견된 숫자의 위치
select id, regexp_instr(id,'\d',1,2)
from professor;
ex) 패턴에 일치하는 n번째 문자열 위치
select regexp_instr('500 ORACLE PARKWAY, REDWOOD SHORES, CA', '[^ ]+', 1,2) as "REGEXP_INSTR"
from dual;
▷ 공백이 아닌 문자열의 반복들 중 처음부터 스캔하여 두 번째 발견된 것의 위치 리턴
■ REGEXP_LIKE
- 주어진 문자열에서 특정패턴을 갖는 경우 반환(where절 사용만 가능)
- 옵션 REGEXP_REPLACE와 동일
** 문법
REGEXP_LIKE(원본, 찾을 문자열, [옵션])
** 시작위치, 추출개수 인수 없음
ex) id 값이 숫자로 끝나는 교수 정보 출력
select *
from professor
where regexp_like(id,'\d$');
■ REGEXP_COUNT
- 주어진 문자열에서 특정패턴의 횟수를 반환
- 옵션 REGEXP_REPLACE와 동일
** 문법
select id, regexp_count(id, '\d') as result1,
regexp_count(id, '\d+') as result2
from professor;
▷ \d는 한 자리수의 숫자를 의미하며 \d+는 연속적인 숫자를 의미함. 따라서 count 시 연속적인 숫자를 하나로 취급함
'SQLD' 카테고리의 다른 글
[2과목] 2-15. PIVOT과 UNPIVOT (1) | 2024.03.08 |
---|---|
[2과목] 2-14. 계층형 질의 (0) | 2024.03.07 |
[2과목] 2-13. TOP N QUERY (0) | 2024.03.07 |
[2과목] 2-12. 윈도우 함수 (0) | 2024.03.07 |
[2과목] 2-11. 그룹 함수 (1) | 2024.03.06 |