2011-09-07 8 views
1

aaa_1, bb_5, c_21, a_b와 같은 값이 있습니다. 이제이 값에서 밑줄과 밑줄을 제거해야합니다. A_b (string_string)는 유효한 값이므로 제거 할 필요는 없습니다. 기본적으로, 문자열에서 후행 _ [임의의 숫자] 만 추출하려면 regexp patern이 필요합니다.Oracle regexp - 문자열에서 후행 밑줄과 숫자를 제거합니다.

나는 오라클 11gR2

어떤 제안을 사용하고?

답변

4

당신은 정규식 표현으로 REGEXP_REPLACE를 사용할 필요 '\ _ [[: 자리 :]] {1}'

이것은이 (탈출) 찾으 후 하나 개 이상의 숫자와 밑줄로 변환

:

예 :

SELECT REGEXP_REPLACE('a_b', '\_[[:digit:]]{1,}'), 
     REGEXP_REPLACE('aaa_1', '\_[[:digit:]]{1,}'), 
     REGEXP_REPLACE('c_21', '\_[[:digit:]]{1,}'), 
     REGEXP_REPLACE('bb_5', '\_[[:digit:]]{1,}') 
    FROM dual; 

반환

a_b 
aaa 
c 
bb 

당신이 알파 문자는 다음의 끝을 의미하는 정규식 문자열의 끝에 $를 추가하지있을 경우에만 밑줄과 숫자를 제거 있는지 확인하려면

문자열.

첫 번째없이

SELECT REGEXP_REPLACE('bb_5b', '\_[[:digit:]]{1,}$'), 
     REGEXP_REPLACE('bb_5b', '\_[[:digit:]]{1,}'), 
     REGEXP_REPLACE('bb_55', '\_[[:digit:]]{1,}$'), 
     REGEXP_REPLACE('bb_55', '\_[[:digit:]]{1,}') 
    FROM dual; 

반환 "$"와

bb_5b 
bbb 
bb 
bb 

정규 표현식은 어색 할 수 있지만,이 링크는 내가 오라클 정규식 표현식 발견 한 것을 이해하는 것이 가장 쉬운 방법 중 하나입니다 http://www.dba-oracle.com/t_regular_expressions.htm

희망이 도움이됩니다.

0

숫자가있는 모든 값을 무시하는 다른 버전입니다. Ollie와 같은 기본 접근 방식이지만 글자인지 확인하기 위해 가치의 첫 부분을 고려합니다. 값의 두 부분을 캡처하여 조건과 일치하는 첫 번째 부분으로 바꿉니다.

select 
    regexp_replace('A_1', '([A-Za-z]+)(\_\d+)', '\1'), 
    regexp_replace('A_B', '([A-Za-z]+)(\_\d+)', '\1'), 
    regexp_replace('cc_21', '([A-Za-z]+)(\_\d+)', '\1'), 
    regexp_replace('1_1', '([A-Za-z]+)(\_\d+)', '\1') 
from dual; 
관련 문제