我正在尝试在regexp_substr()
中写一个正则表达式。
例如,我有一个字符串DA.*BLK
,我想提取A
和B
之间的任何内容。我现在正在使用
replace(replace(regexp_substr(target_column,'A.*B'),'A',''),'B','')`
然后我得到介于两者之间的任何东西。
但是我认为这种方式可能并不高效,也不是很优雅。我也曾尝试在其中使用?=
,但看来Oracle不支持该子句。
有人可以让我知道实现目标的更好方法吗?非常感谢你!
答案 0 :(得分:4)
使用提取组
REGEXP_SUBSTR('DASOMETHINGBLK','DA(.*)BLK', 1,1,NULL,1)
-- ^ ^ ^
--starting from first, find first 1st match bet'n ()
答案 1 :(得分:1)
您不需要正则表达式,可以使用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 <>提琴here