正则表达式否定后缀否定环视不起作用
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
【讨论】:
以上是关于正则表达式否定后缀否定环视不起作用的主要内容,如果未能解决你的问题,请参考以下文章