regexp_replace 질문 0 2 2,292

by 치즈케이크 [Oracle 기초] replace [2017.10.21 17:10:37]


쿼리1

select text, regexp_replace(text,'([0-9])','\1-*')
from t_reg;

결과1

ABC123    ABC1-*2-*3-*
ABC 123    ABC 1-*2-*3-*

 

쿼리2

select text, regexp_replace(text,'[0-9]','\1-*')
from t_reg;

결과2

ABC123    ABC\1-*\1-*\1-*
ABC 123    ABC \1-*\1-*\1-*

 

쿼리3

select text, regexp_replace(text,'([0-9])','1-*')
from t_reg;

결과3

ABC123    ABC1-*1-*1-*
ABC 123    ABC 1-*1-*1-*

패턴을 '('로 묶어주냐 안묶어 주냐에 \(이스케이프문자)의 사용유무에 따른

결과값이 다른 예시들인데요...........

메타 문자에서 '(' 는 하위식 기능, 여러식을 묶는 기능으로 알고있는데.......

저 괄호 하나로...... 결과값이 저렇게 차이가 나는지 궁금하네요

그리고 '\'문자 하나로........ 저렇게 바뀌는것두... 

해설 부탁드립니다.

by jkson [2017.10.21 22:23:54]

regexp_replace는 정규식 형태의 패턴을 찾아 원하는 형태로 바꿔주는 function입니다.

패턴을 괄호로 묶어주게 되면 해당 묶음을 replace string으로 가지고 올 수 있게 됩니다.

괄호가 묶인 순서대로 \1, \2, \3 .. 등으로 사용할 수 있는 것입니다.

regexp_replace(text,'([0-9])','\1-*')

의 경우 숫자가 발견되면

괄호로 묶인 첫 번째 패턴, 여기서는 발견된 숫자에다가 -*을 붙여 replace 하라는 것입니다.

그래서

ABC123 -> ABC1-*2-*3-*

와 같이 변경됩니다.

regexp_replace(text,'[0-9]','\1-*')

의 경우 숫자가 발견되면 해당 숫자를 \1-*로 대체하라는 것입니다.

정규식에서 괄호로 묶은 패턴이 없기 때문에 \1은 첫 번째 괄호로 묶인 패턴이 아니라 그냥 문자 \1이 됩니다.

세 번째는 괄호는 묶어주었으나 \1 와 같이 패턴을 가지고 오지 않았기 때문에 그대로 replace 된 것이구요.

regexp_replace(text,'([A-Z]+)([0-9]+)','\1=>알파벳\2=>숫자')

이와 같이 사용하게 되면

ABC123 는

ABC=>알파벳123=>숫자

와 같이 replace 되겠지요.


by 치즈케이크 [2017.10.25 18:18:41]

제가 문의를 애매하게 적은감이 있는데 

제가 원하는것만 정확히 집어주셨네요! 감사합니다!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입