달나라 노트

Redshift : regexp_replace (regular expression replace) 본문

SQL/Redshift

Redshift : regexp_replace (regular expression replace)

CosmosProject 2020. 12. 23. 23:08
728x90
반응형

 

 

 

 

 

Redshift에선 Regular expression을 이용한 replace 기능을 제공합니다.

 

 

 

regexp_replace(old_text, re_exp_pattern, new_text)

regexp_replace의 사용법은 위와 같습니다.

old_text에서 re_exp_pattern과 일치하는 부분을 찾아 new_text로 바꾸라는 뜻이죠.

 

 

 

 

select  regexp_replace('abc@123.com', '@.*\\.com', '') -> abc 반환
        , regexp_replace('abc@email.com', '@.*\\.com', '') -> abc 반환
        , regexp_replace('abc@email123.com', '@.*\\.com', '') -> abc 반환
;

위 쿼리의 결과는 모두 abc를 반환합니다.

한번 re_exp_pattern 부분을 봅시다.

 

@.*\\.com

@ -> @는 별도의 기능이 없으니 문자 @ 그자체를 의미합니다.

. -> .은 모든 문자를 의미합니다.

* -> *은 바로 왼쪽의 문자가 0번 이상 반복되는 것을 의미합니다. (e.g. a*라고 하면 '', 'a', 'aa', 'aaa', 'aaaa', ... 등의 모든 것을 포함하는 의미를 가집니다.)

\\. -> 앞에서 .은 모든 문자를 의미한댔는데 이렇게 기능을 가진 기호 앞에 백슬래쉬를 2개 붙이면 escape가 되어 문자 그자체를 의미합니다. 즉 이건 마침표 그 자체를 텍스트로 인식하라는 의미입니다.

com -> 이것은 그냥 com 텍스트 그 자체입니다.

 

다 종합해보면 @.*\\.com 이라는 정규표현식은

@(0개 이상의 텍스트).com 의 패턴을 가진 모든 텍스트를 찾으라는 뜻이죠.

-> 즉, 메일의 id@mail.com에서 @mail.com 부분을 인식하라는 뜻입니다.

 

따라서 위 식은 @부터 .com까지 모든 문자가 공백('')으로 바뀌는거죠.

 

 

 

 

select  regexp_replace('abc@123.com', '@.*\\.com', '_replaced') -> abc_replaced 반환
        , regexp_replace('abc@email.com', '@.*\\.com', '_replaced') -> abc_replaced 반환
        , regexp_replace('abc@email123.com', '@.*\\.com', '_replaced') -> abc_replaced 반환
;

동일한 예시지만 공백이 아닌 다른 문자로 대체하는 경우입니다.

 

 

 

 

 

 

select  regexp_replace('abc(def)', '\\(.*\\)', '') -> abc 반환
        , regexp_replace('abc(123456)', '\\(.*\\)', '') -> abc 반환
        , regexp_replace('abc(def123xyz456)', '\\(.*\\)', '') -> abc 반환
;

위 예시도 모두 결과로 abc를 반환합니다.

 

여는 괄호( 와 닫는 괄호)는 모두 기능을 가지고 있습니다.(아래 표 참조.)

근데 저는 위 예시의 old_text에서 괄호와 그 속에 있는 모든 글자를 공백으로 바꾸고 싶습니다.

이런 경우 괄호 앞에 백슬래쉬를 2개 붙여서 여는 괄호와 닫는 괄호를 모두 escape 해줍니다.

 

 

 

 

 

 

 

 

사용 가능한 Pattern은 아래 표를 참고하면 됩니다.

(참고 : docs.aws.amazon.com/ko_kr/redshift/latest/dg/pattern-matching-conditions-posix.html)

Sign Description
. 모든 문자를 일치시킵니다.
* 0개 이상의 발생 패턴을 일치시킵니다.
+ 1개 이상의 발생 패턴을 일치시킵니다.
? 0개 또는 1개의 발생 패턴을 일치시킵니다.
| 대체할 일치 패턴을 지정합니다. 예를 들어 E | H  E 또는 H를 의미합니다.
^ 라인 시작 문자를 일치시킵니다.
$ 라인 끝 문자를 일치시킵니다.
$ 문자열 끝을 일치시킵니다.
[ ] 대괄호는 일치하는, 즉 목록의 표현식 1개와 일치해야 하는 목록을 지정합니다. 일치하지 않는, 즉 목록의 표현식을 제외한 모든 문자와 일치하는 목록 앞에는(^)이 입력됩니다.
( ) 그룹 항목을 괄호로 묶어 단일 논리 항목으로 처리합니다.
{m} 이전 항목을 정확히 m번 반복합니다.
{m,} 이전 항목을 m번 이상 반복합니다.
{m,n} 이전 항목을 m번 이상, n번 미만 반복합니다.
[: :] POSIX 문자 클래스 안에 있는 모든 문자를 일치시킵니다. 다음 문자 클래스에서 Amazon Redshift는 ASCII 문자만 지원합니다. [:alnum:], [:alpha:], [:lower:],[:upper:]

 

 

 

Operator Description Same operator
\\d 숫자 문자 [[:digit:]]
\\D 숫자를 제외한 문자 [^[:digit:]]
\\w 단어 문자 [[:word:]]
\\W 단어를 제외한 문자 [^[:word:]]
\\s 공백 문자 [[:space:]]
\\S 공백을 제외한 문자 [^[:space:]]

 

 

 

 

 

728x90
반응형
Comments