繁体   English   中英

在Oracle正则表达式中等效于?=

[英]What is equivalent of ?= in Oracle regular expression

我正在尝试在regexp_substr()编写一个正则表达式。

例如,我有一个字符串DA.*BLK ,我想提取AB之间A任何内容。 我现在正在做的是使用

replace(replace(regexp_substr(target_column,'A.*B'),'A',''),'B','')` 

然后我得到介于两者之间的任何东西。

但是我认为这种方式可能并不高效,而且不够优雅。 我也尝试在其中使用?= ,但似乎Oracle不支持该子句。 有人可以让我知道实现目标的更好方法吗? 非常感谢你!

使用提取组

REGEXP_SUBSTR('DASOMETHINGBLK','DA(.*)BLK', 1,1,NULL,1)
               --                           ^ ^      ^
               --starting from first, find first     1st match bet'n ()

http://sqlfiddle.com/#!4/97eade/967

您不需要正则表达式,可以使用LIKE运算符和字符串函数:

Oracle安装程序

CREATE TABLE table_name ( id, column_name ) AS
  SELECT 1, 'dablk' FROM DUAL UNION ALL
  SELECT 2, 'datestblk' FROM DUAL UNION ALL
  SELECT 3, 'atestblk' FROM DUAL UNION ALL
  SELECT 4, 'datestbl' FROM DUAL UNION ALL
  SELECT 5, 'dadatestblkblk' FROM DUAL;

查询 -对于以da开头并以blk结尾的字符串:

SELECT id,
       SUBSTR( column_name, 3, LENGTH( column_name ) - 5 )
FROM   table_name
WHERE  column_name LIKE 'da%blk';

结果

ID | SUBSTR(COLUMN_NAME,3,LENGTH(COLUMN_NAME)-5)
---|--------------------------------------------
 1 | (null)
 2 | test
 5 | datestblk

查询 -对于带有a然后b字符串:

SELECT id,
       SUBSTR(
         column_name,
         first_a + 1,
         last_b - first_a - 1
       ) AS value
FROM   (
  SELECT t.*,
         INSTR( column_name, 'a' ) AS first_a,
         INSTR( column_name, 'b', -1 ) AS last_b
  FROM   table_name t
  WHERE  column_name LIKE '%a%b%'
)

结果

ID | VALUE    
---|----------
 1 | (null)
 2 | test     
 3 | test     
 4 | test     
 5 | datestblk

db <> 在这里拨弄

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM