【问题标题】: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' 结尾的行。

标签: sql regex oracle


【解决方案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

      【讨论】:

        猜你喜欢
        • 2011-12-07
        • 1970-01-01
        • 2014-03-31
        • 2016-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-13
        • 1970-01-01
        相关资源
        最近更新 更多