2017-05-03 12 views
1

불행히도 \b 오라클에서는 정규 표현식 문자가 작동하지 않습니다. 해결 방법으로오라클 11g 정규 표현식 문자

나는 다음과 같은 표현을 발견

(^|\s|\W)(100100|100101|100102|100103)($|\s|\W) 

(참조 : The missing \b regular expression special character in Oracle.를)하지만, 테스트 문자열 데이터에 : 나는 동안

Test string 100100/100101, ABC-DEF, 100102 100103 test data abc100100 100100abc. 

100101100103는 일치하지 그것들이 일치하는 것을 기대하는 것은 \b 표현의 경우입니다.

작동시킬 수있는 방법이 있습니까? Oracle 11g를 사용하고 있습니다.

나는 어떤 도움을 주시면 감사하겠습니다.

는 편집 :

내 목표는 모든 경기에 태그를하는 것입니다. 내가 기대하고 출력은이 목적에

Test string [ddd]100100[/ddd]/[ddd]100101[/ddd], ABC-DEF, [ddd]100102[/ddd] [ddd]100103[/ddd] test data abc100100 100100abc. 

내가 다음 문을 사용하고 있습니다 :

regexp_replace(p_text,'(^|\s|\W)(' || l_ids || ')($|\s|\W)', '\1[ddd]\2[/ddd]\3'); 

을 여기서

  • l_ids - ID 수 |에 의해 분리 된 ID의 목록 숫자, 문자, 밑줄 및 대시 포함
  • - 입력 텍스트

EDIT 2 : 상기 시험 문자열 값 100100에서

는 단어뿐만 아니라 abc100100100100abc으로 일치되지 않아야한다.

+0

다른 행에서 일치 항목을 출력 하시겠습니까? –

+0

두 번째'(^ | \ s | \ W)'는'($ | \ s | \ W)'이어야합니다. 또한'\ s'는'\ W'에 이미 포함되어 있습니다. 첫 번째 숫자 다음에 나오는'/'는 첫 번째 패턴에 의해 소비되어 두 번째 일치를 위해 사용될 수 없으므로 미리보기 없이는 해결하기가 어렵습니다. –

+0

@vkp 질문에 대한 나의 편집을 참조하십시오. – kpater87

답변

0

가정 -

  • chr(1) 텍스트
  • [a-zA-Z0-9]에없는 모든 문자에 나타나지 않는 것은 구분 기호 (예 : /)

with t (p_text) as (select 'Test string 100100/100101, ABC-DEF, 100102 100103 test data abc100100 100100abc.' from dual) 

select replace 
     (
      regexp_replace 
      (
       regexp_replace 
       (
        p_text 
        ,'([a-zA-Z0-9]+)' 
        ,chr(1) || '\1' || chr(1) 
       ) 
       ,chr(1) || '(100100|100101|100102|100103)' || chr(1) 
       ,'[ddd]\1[/ddd]' 
      ) 
      ,chr(1) 
     ) 

from t 
로 간주됩니다

T est 문자열 [ddd] 100100 [/ ddd]/[ddd] 100101 [/ ddd], ABC-DEF, [ddd] 100102 [/ ddd] [ddd] 100103 [/ ddd] 테스트 데이터 abc100100 100100abc.

+0

예, 작동합니다. ! 그러나 한 가지 문제가 있습니다. 긴 입력 문자열에는 작동하지 않습니다. 내 테스트는 첫 번째'REGEXP_REPLACE'가 출력을 4000 바이트로 자른다는 것을 보여준다. 그러나 두 번째'REGEXP_REPLACE'는 출력을 약 1800 바이트로 잘라냅니다. 이것은 이해할 수없는 sth입니다.하지만 PL/SQL을 사용하면이 문제를 해결할 수 있습니다. 고맙습니다. – kpater87