2014-02-27 46 views
2

我有一個正則表達式,在Java中運行良好,但在Oracle中不起作用。oracle負面展望正則表達式不起作用

它尋找<a href="abcd" etc etc xyz >標籤,其中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 > 

,並替換成

<a href="abcd" etc etc xyz> 

如果已經有數據列串,我不應該插入另一XYZ,而只是把它。因此,可以說,如果列有數據這樣

<a href="abcd" etc etc > 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使用負的樣子

<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') 

但是由於不支持負向預測,或者我的reqex與oracle不兼容,所以我沒有找到任何匹配。這在Java中工作。

+3

我不認爲環視斷言在Oracle支持。 – MElliott

回答

1

沒有關於與Oracle SQL中的reg表達式相關的負向預覽功能的文檔。

因此,一個使用解碼聲明再現負向前查找功能在這裏:

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. 檢查,看看我們是否有「一」與HREF元素=「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.