2014-02-27 3 views
2

Java에서는 제대로 작동하지만 Oracle에서는 작동하지 않는 정규식이 있습니다.oracle negative look ahead 정규 표현식이 작동하지 않음

요소 블록에 xyz이없는 <a href="abcd" etc etc xyz > 태그를 찾습니다.

<a href="abcd" etc etc xyz > = not match 
<a href="abcd" etc etc > = match 

REGX : (<[a][\s]+[^>]*[href]="[^>](?:(?!xyz).)*?)(>)

하지만 같은 일이

select I from atable 
where regexp_like (column, '(<[a][\s]+[^>]*[href]="[^>](?:(?!xyz).)*?)(>)') 

어떤 생각 오라클

에서 null을 반환?

이 문제에 대해 더 자세히 설명하겠습니다. 사실 저는 이것을 성취해야합니다. html 구문 데이터가 포함 된 텍스트 열 'datacolumn'이 있다고 가정 해 보겠습니다. 나는 문자열을

<a href="abcd" etc etc > 

을 발견하고, 내가 다른 XYZ를 삽입하지만, 단순히 그것을 떠나지해야 이미 데이터 열 문자열이있는 경우

<a href="abcd" etc etc xyz> 

와 그것을 교체해야합니다. 그래서 열이

<a href="abcd" etc etc > asdf </a> etc etc <a href="efgh" etc etc xyz> 

같은 데이터가있는 경우 다음 내가 앞서이 같은 이중 XYZ를 삽입 결국 부정적인 모습을 사용하지 않는 경우이

<a href="abcd" etc etc xyz> asdf </a> etc etc <a href="efgh" etc etc xyz> 

로 교체 한하고 싶은 말은 할 수 있습니다

<a href="abcd" etc etc xyz> asdf </a> etc etc <a href="efgh" etc etc xyz xyz> 

내가 사용하고

REGEXP_REPLACE(datacolunm,'(<[a][\s]+[^>]*[href]="[^>](?:(?!xyz).)*?)(>)')','\1 xyz \3') 

하지만 negative lookahead가 지원되지 않거나 reqex가 oracle과 호환되지 않기 때문에 일치하는 항목을 찾을 수 없습니다. Java에서 작동합니다.

+3

내가 lookaround 주장은 오라클에서 지원됩니다 생각하지 않습니다. – MElliott

답변

1

Oracle SQL의 reg 표현식과 관련된 negative lookahead 기능에 대한 문서가 없습니다. 우리는 HREF와 "A"요소가 있는지 확인하기 위해

SELECT 
    DECODE(
     REGEXP_SUBSTR(
      REGEXP_SUBSTR('<a href="abcd" etc etc >', '<a\s[^>]*href="abcd"[^>]*>'), 
      'xyz' 
     ), 
     'xyz', 
     NULL, 
     REGEXP_SUBSTR('<a href="abcd" etc etc >', '<a [^>]*href="abcd"[^>]*>') 
    ) 
FROM dual; 

설명

  1. 확인 :

    따라서, 하나는 여기에 부정적 예측 기능을 재현하는 디코드 문을 사용하여 = "abcd"속성이 기능을 가진 첫 번째 :

    REGEXP_SUBSTR('<a href="abcd" etc etc >','<a\s[^>]*href="abcd"[^>]*>')

  2. 문자열 패턴 'xyz'가이 요소 내에 있는지 검색합니다.

    REGEXP_SUBSTR(calculation 1 ,'xyz')

  3. 디코드

    if 'xyz' exists in element, then NULL otherwise element.

관련 문제