需要在 Oracle 中通过正则表达式提取子字符串。例如,/root/abc/dev
您需要为 提取abc/dev
,但不需要为 提取任何内容/root/item/abc/dev
。即/root/item/(.*)
,特例。对于 PostgreSQL,您可以这样做:
substring('/root/abc/dev/item', '\/root\/(?!(item))(.*)')
如何为 Oracle 做同样的事情?这种方式不起作用:
REGEXP_SUBSTR('/root/abc/def', '\/root\/(?!(item))(.*)')
所以,这里取第 3 组 - (.*)(指定为函数的最后一个参数),如果存在 'item/',否则为 null选择 REGEXP_SUBSTR('/root/item/abc/dev', '(/root/)(item/)(.*)', 1, 1, 'i', 3) FROM DUAL;或者通过 CASE 和 REGEXP_LIKE
Oracle 在子表达式语法上有点差,所以
在数据库应用程序中使用正则表达式,Oracle 文档
如果只是一个正则表达式,那么像这样:
SELECT REGEXP_SUBSTR('/root/item/abc/dev/rteg/wgw', '(/root/)([^(item)]+.*)', 1, 1, 'i', 2) FROM DUAL;
即使
item
它出现在行的后面,也不会被丢弃,第二个 (3,4,..,n)item
'a 之后的所有内容也不会被丢弃。