복붙노트

[SQL] 어떻게 오라클에서 정규 표현식에서 그룹을 추출하는?

SQL

어떻게 오라클에서 정규 표현식에서 그룹을 추출하는?

나는이 쿼리를 가지고와 괄호 사이의 값을 추출 할.

select de_desc, regexp_substr(de_desc, '\[(.+)\]', 1)
from DATABASE
where col_name like '[%]';

그러나 그것은 이러한 "[TEST]"로 내게 브래킷 값을 제공한다. 난 그냥 "TEST"를 원한다. 어떻게 그걸 얻기 위해 쿼리를 수정합니까?

해결법

  1. ==============================

    1.REGEXP_SUBSTR 함수의 세 번째 매개 변수는 검색을 시작하고자합니다 (예 de_desc)를 대상 문자열의 위치를 ​​나타냅니다. 경기를 가정하면 문자열의 주어진 부분에서 발견된다, 그것은 반환 무엇에 영향을주지 않습니다.

    REGEXP_SUBSTR 함수의 세 번째 매개 변수는 검색을 시작하고자합니다 (예 de_desc)를 대상 문자열의 위치를 ​​나타냅니다. 경기를 가정하면 문자열의 주어진 부분에서 발견된다, 그것은 반환 무엇에 영향을주지 않습니다.

    오라클 11g에서, 나는 당신이 돌려 원하는 캡처 그룹을 나타냅니다 사용하려고하는 것입니다 생각, 함수에 여섯 번째 매개 변수가있다. 적절한 사용의 예는 다음과 같습니다

    SELECT regexp_substr('abc[def]ghi', '\[(.+)\]', 1,1,NULL,1) from dual;
    

    어디에서 마지막 매개 변수 (1) 당신이 반환하려는 캡처 그룹의 수를 나타냅니다. 다음 매개 변수를 설명하는 문서에 대한 링크입니다.

    10g는이 옵션이 표시되지 않습니다,하지만 경우에 당신은과 같은 결과를 얻을 수 있습니다 :

    select substr( match, 2, length(match)-2 ) from (
    SELECT regexp_substr('abc[def]ghi', '\[(.+)\]') match FROM dual
    );
    

    당신은 경기가 시작과 끝에서 정확히 하나의 여분의 문자가있을 것이라는 점을 알고 있기 때문이다. (다른 방법으로는 결과의 양쪽 끝에서 제거 브래킷에 RTRIM과 LTRIM를 사용할 수 있습니다.)

  2. ==============================

    2.당신은 교체하고 전체 문자열과 일치하는 정규식 패턴을 사용 할 필요가있다.

    당신은 교체하고 전체 문자열과 일치하는 정규식 패턴을 사용 할 필요가있다.

    select regexp_replace(de_desc, '.*\[(.+)\].*', '\1') from DATABASE;
    
  3. from https://stackoverflow.com/questions/7758859/how-to-extract-group-from-regular-expression-in-oracle by cc-by-sa and MIT license