쿼리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-*
패턴을 '('로 묶어주냐 안묶어 주냐에 \(이스케이프문자)의 사용유무에 따른
결과값이 다른 예시들인데요...........
메타 문자에서 '(' 는 하위식 기능, 여러식을 묶는 기능으로 알고있는데.......
저 괄호 하나로...... 결과값이 저렇게 차이가 나는지 궁금하네요
그리고 '\'문자 하나로........ 저렇게 바뀌는것두...
해설 부탁드립니다.
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 되겠지요.