正则表达式否定后缀否定环视不起作用

Posted

技术标签:

【中文标题】正则表达式否定后缀否定环视不起作用【英文标题】:Regex negate suffix negative lookaround not working 【发布时间】:2021-08-25 09:55:00 【问题描述】:

我正在尝试将以模式“NEW”结尾的行设置为 null。

这将是我想要的输出(输入只是第一列):

           DCALIVE      DESIRED_OUTPUT
--------------------------------------
      DCA_LIVE_NEW                NULL 
     DCA_LIVE_NEWS       DCA_LIVE_NEWS
DCA_LIVE_NO_RECALL  DCA_LIVE_NO_RECALL  
 DCA_LIVE DCA_LIVE   DCA_LIVE DCA_LIVE

到目前为止,我已经尝试了其他答案中建议的否定环视,但它不会返回任何行的值

WITH aux ( dcalive ) AS (
    SELECT
        'DCA_LIVE_NEW'
    FROM
        dual
    UNION ALL
    SELECT
        'DCA_LIVE_NEWS'
    FROM
        dual
    UNION ALL
    SELECT
        'DCA_LIVE_NO_RECALL'
    FROM
        dual
    UNION ALL
    SELECT
        'DCA_LIVE'
    FROM
        dual
)
SELECT
    a.*,
    decode(regexp_substr(dcalive, '(?!NEW)$'), NULL, NULL, dcalive) desired_output
FROM
    aux a;

【问题讨论】:

(?!NEW)$ 是匹配任何字符串的错误正则表达式模式。您打算使用 (?<!NEW)$,但 Oracle 正则表达式无论如何都不支持环视。 我也试过 [^(NEW)]$,但没有运气:( 你的第一句话和样本数据正好相反。 @GordonLinoff 你是什么意思? @banana_99 。 . . “我正在尝试将不以模式‘NEW’结尾的行设置为空。”您正在设置NULL'NEW' 结尾的行。 【参考方案1】:

您可以使用case 表达式:

select (case when dcalive not like '%NEW' then dcalive end) as desired_output

这不需要正则表达式。但是您可以将其表示为正则表达式:

select (case when not regexp_like(dcalive, 'NEW$)' then dcalive end) as desired_output

【讨论】:

【参考方案2】:

你可以使用

([^N].2|.[^E].|..[^W]|^.0,2)$

请参阅regex demo。 详情

([^N].2|.[^E].|..[^W]|^.0,2) - 任何一个 [^N].2 - 任何非N 和两个字符 | - 或 .[^E]. - 任何字符,非E,任何字符 | - 或 ..[^W] - 任意两个字符和一个非W | - 或 ^.0,2 - 搅拌开始和任何零、一或两个字符 $ - 字符串结束。

【讨论】:

【参考方案3】:

一种选择是保留 negative start_position 参数,以便向后查看字符以及条件语句,例如

SELECT dcalive, DECODE( SUBSTR(dcalive,-3), 'NEW', NULL, dcalive ) AS output
  FROM aux

Demo

【讨论】:

以上是关于正则表达式否定后缀否定环视不起作用的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式环视

巧解正则表达式环视

巧解正则表达式环视

正则表达式的环视和匹配

正则基础之 环视

正则之环视