Oracle 正则表达式中的 ?= 等价于啥
Posted
技术标签:
【中文标题】Oracle 正则表达式中的 ?= 等价于啥【英文标题】:What is equivalent of ?= in Oracle regular expressionOracle 正则表达式中的 ?= 等价于什么 【发布时间】:2018-07-09 05:21:26 【问题描述】:我正在尝试在regexp_substr()
中编写正则表达式。
例如,我有一个字符串DA.*BLK
,我想提取A
和B
之间的任何内容。我现在做的是使用
replace(replace(regexp_substr(target_column,'A.*B'),'A',''),'B','')`
然后我得到介于两者之间的任何东西。
但我认为这种方式可能效率不高,也不优雅。我也尝试在那里使用?=
,但似乎Oracle 不支持这样的子句。
任何人都可以让我知道一种更好的方法来实现我的目的吗?非常感谢!
【问题讨论】:
你为什么不用regexp_replace()
可能重复:***.com/q/7758859/2422776。不投票以重复关闭,所以我不会误击。
你能给我举个例子吗?
你需要像'AAA123BBB'
这样的字符串得到什么结果?
@APC 很好,谢谢!我想如果我有这种问题,我会在 A 或 B 的数量方面更具体。例如,如果我需要123
,我会使用REGEXP_SUBSTR(AAA123BBB','AAA(.*)BBB', 1,1,NULL,1)
,或者我可以使用更多的相邻字符来指定边界。但如果您有更好的解决方案,请告诉我。
【参考方案1】:
使用提取组
REGEXP_SUBSTR('DASOMETHINGBLK','DA(.*)BLK', 1,1,NULL,1)
-- ^ ^ ^
--starting from first, find first 1st match bet'n ()
http://sqlfiddle.com/#!4/97eade/967
【讨论】:
绝对是最简洁的解决方案。但是,请注意,此解决方案仅适用于 11g 中引入的第六个参数 subexpression。此外,它可能不会产生像'AAA123BBB'
这样的字符串的预期结果
@APC 也感谢您的评论。这是一个很好的观点!【参考方案2】:
您不需要正则表达式,可以使用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
【讨论】:
以上是关于Oracle 正则表达式中的 ?= 等价于啥的主要内容,如果未能解决你的问题,请参考以下文章