【问题标题】:oracle negative look ahead regular expression not workingoracle否定前瞻正则表达式不起作用
【发布时间】:2014-03-31 06:38:53
【问题描述】:

我有一个在 Java 中运行良好但在 Oracle 中运行良好的正则表达式。

它寻找<a href="abcd" etc etc xyz > 标签,其中xyz 不在元素块中。

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

正则表达式:(&lt;[a][\s]+[^&gt;]*[href]="[^&gt;](?:(?!xyz).)*?)(&gt;)

但同样的事情在 Oracle 中返回 null

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

有什么想法吗?

让我进一步澄清这个问题。其实我需要做到这一点。 假设我们有一个文本列“datacolumn”,其中包含 html 语法数据。我需要找到字符串

<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 中有效。

【问题讨论】:

  • 我认为 Oracle 不支持环视断言。

标签: sql regex database oracle negative-lookahead


【解决方案1】:

没有关于与 Oracle SQL 中的 reg 表达式相关的负前瞻功能的文档。

因此,这里使用 decode 语句来重现负前瞻功能:

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" 属性的“a”元素:

    REGEXP_SUBSTR('&lt;a href="abcd" etc etc &gt;','&lt;a\s[^&gt;]*href="abcd"[^&gt;]*&gt;')

  2. 搜索该元素中是否存在字符串模式“xyz”。

    REGEXP_SUBSTR( calculation 1 ,'xyz')

  3. 解码

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

【讨论】:

    猜你喜欢
    • 2011-07-21
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多