Oracle regexp_replace 특수문자 - oracle regexp_replace teugsumunja

투케이2K

OracleDB

174. (Oracle/오라클) REGEXP_REPLACE 정규식을 사용해 특정 패턴 문자 변경 및 제거 수행 실시

투케이2K 2022. 5. 20. 17:31


[개발 환경 설정]

개발 툴 : Toad

개발 언어 : Oracle

Oracle regexp_replace 특수문자 - oracle regexp_replace teugsumunja


[소스 코드]

/*
[REGEXP_REPLACE 정규식을 사용해 특정 패턴 문자 변경 및 제거 수행 실시]
1. REGEXP_REPLACE 은 특정 패턴 문자를 찾아서 바꿀려는 값으로 변경해줍니다
2. REGEXP_REPLACE(원본데이터, 정규식, 변경값) 방법으로 문법을 사용합니다
3. 0-9 : 숫자 패턴을 지정합니다
4. a-z : 소문자 패턴을 지정합니다
5. A-Z : 대문자 패턴을 지정합니다
6. ㄱ-ㅎㅏ-ㅣ가-힣 : 한글 패턴을 지정합니다
7. [:punct:] : 전체 특수문자를 지정합니다
*/


SELECT REGEXP_REPLACE('!@#$%#$HELLO12h@#$%i356투케이8입니다++', '[0-9]', '') AS 숫자제거,
       REGEXP_REPLACE('!@#$%#$HELLO12h@#$%i356투케이8입니다++', '[a-zA-Z]', '') AS 영어제거,
       REGEXP_REPLACE('!@#$%#$HELLO12h@#$%i356투케이8입니다++', '[ㄱ-ㅎㅏ-ㅣ가-힣]', '') AS 한글제거,
       REGEXP_REPLACE('!@#$%#$HELLO12h@#$%i356투케이8입니다++', '[!@#$%^&*()]', '') AS 지정특수문자제거,
       REGEXP_REPLACE('!@#$%#$HELLO12h@#$%i356투케이8입니다++', '[[:punct:]]', '') AS 전체특수문자제거
    FROM DUAL;

Oracle regexp_replace 특수문자 - oracle regexp_replace teugsumunja

REGEXP_REPLACE 함수

- 주어진 문자열에서 특정 패턴을 찾아서 주어진 다른 모양으로 치환하는 함수

사용 예제 1 : 모든 숫자를 특수 기호로 변경하기

Oracle regexp_replace 특수문자 - oracle regexp_replace teugsumunja

‘[[:digit:]] 부분은 [:문자클래스:]의 형태로 표현을 합니다. 그리고 “문자 클래스”에 들어갈 수 있는내용은 alpha, blank, cntrl, digit, graph, lower, print, space, upper, xdigit의 종류가 있습니다.

많이 사용되는 것의 예를 들면 [:digit:]는 [0-9]의 의미이고 [:alpha:]는 [A-Za-z]와 같은 의미를 나타내고 [:space:]는 공백을 의미합니다.

사용 예제 2 : 특정 패턴을 찾아서 패턴을 변경하기

숫자를 찾아서 숫자 뒤에 ‘-*’를 추가하는 예제입니다.

Oracle regexp_replace 특수문자 - oracle regexp_replace teugsumunja

비슷한 예로 아래 화면은 ip부분의 .(dot) 부분을 모두 삭제하고 출력하는 예입니다.

Oracle regexp_replace 특수문자 - oracle regexp_replace teugsumunja

사용 예제 3 : 사용자에게 입력받은 문자 가운데 공백이 여러 개 들어 있을 경우 그 공백을 제거시키는 방법

예를 들어, 사용자 ID가 ‘aaa bbb’ 처럼 중간에 공백이 있을 경우 ‘aaa’와 ‘bbb’사이에 공백을 없애고 출력하는 방법입니다.

Oracle regexp_replace 특수문자 - oracle regexp_replace teugsumunja

위 예제에서 {1,} 부분을 {1}로 해도 됩니다. 위 예에서 { } 내의 숫자는 앞 문자가 나타나는 횟수 또는 범위를 의미합니다. 예를 들어, a{5}의 의미는 ‘a’의 5번 반복인 aaaaa만을 의미합니다. 이 형태의 변형인 a{3,}은 ‘a’가 세 번 이상 반복인 aaa, aaaa, aaaaa, … 등을 의미합니다. 그리고 a{3, 5}의 의미는 aaa, aaaa, aaaaa를 의미하며 ab{2,3}은 뒤의 b가 두 번과 세 번 반복된 형태인 abb와 abbb를 의미합니다.

다음 예는 ‘abc bbb’에서 ( ) (괄호 사이는 공백)이 {2,} (두 칸 이상)인 것을 찾아서 “(공백을 제거)하라는 의미입니다. 그래서 그 결과로 공백이 한 칸인 첫 번째 ‘aaa bbb’값은 공백이 제거되지 않은 채 출력되었고 공백이 두 칸인 두 번째 ‘aaa bbb’은 공백이 제거되어 출력되었습니다.

Oracle regexp_replace 특수문자 - oracle regexp_replace teugsumunja

다른 예를 한 가지 더 살펴보겠습니다.

Oracle regexp_replace 특수문자 - oracle regexp_replace teugsumunja

이해가 되셨나요? 공백이 세 칸이여도. {2,}는 2칸 이상을 의미하다는 걸 잊지 않으셔야 합니다!


Oracle Regular Expression 함수 regexp_replace( ) 는 replace( ) 함수에 정규표현식을 쓸 수 있도록 확장한 함수 입니다.

replace( ) 함수가 대상문자열에서 특정 문자열(Search String) 찾아서 다른 문자열로 바꿔치기 해주는 함수인데,

regexp_replace( ) 함수는 Search String 대신에 "정규표현식"을 쓴다는 점이 다릅니다.

regexp_replace() 함수의 구문(Syntax)은 다음과 같습니다.

Oracle regexp_replace 특수문자 - oracle regexp_replace teugsumunja

source_char : 대상 문자열

pattern : 정규표현식 패턴

replace_string : 바꿔치기할 문자열

position : 문자열내에서 (패턴을 체크할) 처음 시작 위치

occurrence : 몇번째 일치하는 건지.  ( 0 이면 전부 바꿔치기 )

match_param : 'i' (대소문자 무시),  'c' (대소문자 구분)

예제를 통해서 사용법을 확인해보면,

 문자열내에서 'CD' 를 '--' 으로 바꿔치기 (대소문자 구분)

Oracle regexp_replace 특수문자 - oracle regexp_replace teugsumunja

'c' 인자를 줬기 때문에 대소문자를 구분해서 cd 는 놔두고, CD 문자들만 -- 로 대체되었습니다.

5번째 인자에 0 을 줬기 때문에 일치하는 모든 문자열을 바꿔치기 합니다.

0 이 아닌 값을 주면, 일치하는 n 번째 문자열만 바꿔치기 할 수 있습니다.

♣ 문자열에서 숫자만 모조리 제거하기

Oracle regexp_replace 특수문자 - oracle regexp_replace teugsumunja

패턴 [^[:alpha:]] 에서 [:alpha] 는 앞파벳(대소문자포함)을 가리키는 문자셋입니다.

앞에 ^가 붙어있으니 부정의 의미가 됩니다. 즉, 알파벳이 아닌것들을 찾아라~~ 입니다.

regexp_replace( ) 함수에서 3번째 replace_string 들어갈 자리를 지정하지 않으면 null 을 의미합니다.

즉, 알파벳이 아닌 놈들을 찾아서 모두 null 로 바꿔라~  모두 제거하라~  가 되겄습니다.

♣ 문자열에서 알파벳문자들만 특수문자 # 으로 대체하기

Oracle regexp_replace 특수문자 - oracle regexp_replace teugsumunja

알파벳이 아니라 숫자를 바꾸려면 [[:alpha:]] 대신에 [[:digit:]] 를 사용하면 됩니다.

물론, [[:digit:]] 대신에 [[0-9]] 를 써도 되고, [[:alpha:]] 대신에 [A-Za-z] 를 써도 됩니다.

♣ 문자열에서 한글 문자들만 제거하기

Oracle regexp_replace 특수문자 - oracle regexp_replace teugsumunja

UTF8 한글의 경우, '가' 글자부터 시작해서 '힟' 으로 끝나기 때문에 [가-힟] 으로 패턴을 지정하면 모든 한글이 됩니다.

EUC-KR 한글의 경우에는 마지막 글자가 '힟' 이 아니라 '힝' 입니다.

그래서 EUC-KR 인 경우는 패턴문자열을 [가-힝] 으로 지정해줘야 모든 한글이 잡히게 됩니다.

▶ 참고 : 오라클 정규표현식(Regular Expression) 소개 메인 페이지