如果关键字是“查找”,是否可以提取“查找”之间的字符串?
stackoverflow is awesome. FindHello, World!Find It has everything!
结果应该是'Hello,World!'因为字符串在“查找”之间 我最初的想法是使用Instr找到两个“查找”,然后找到“查找”之间的内容。
有没有更好的方法呢?
答案 0 :(得分:2)
您可以使用regular expressions或instr()
来实现您的目标。
我实际上更喜欢正则表达式,如果你使用的是10g或更高版本,因为我发现使用instr()
进行多次扭曲相当笨拙,但这取决于你。
with phrases as (
select 'stackoverflow is awesome. FindHello, World!Find It has everything!' as phrase
from dual
)
select substr( phrase
, instr(phrase,'Find',1,1) + 4
, instr(phrase,'Find',1,2)
- instr(phrase,'Find',1,1)
- 4
)
from phrases
这将从第一个字符开始获取字符串Find
的第一次和第二次出现,然后使用这些字符来计算您应该在子字符串上执行的位置。
或者,使用正则表达式:
with phrases as (
select 'stackoverflow is awesome. FindHello, World!Find It has everything!' as phrase
from dual
)
select regexp_replace(phrase
, '([[:print:]]+Find)([[:print:]]+)(Find[[:print:]]+)', '\2')
from phrases
;
这会多次使用任何可打印字符,然后是字符串Find
等。但是,主要位是分组()
,它将短语的每个部分分开。 \2
表示原始匹配字符串仅包含第二个组,即返回Find
之间的字符串。
这里有一点SQL Fiddle来演示。
答案 1 :(得分:1)
此查询假设处理两个以上的“查找”
with SourceString as(
select 'Find123Find45345Find76876234Find87687Find' s_string
, 'Find' delimiter
from dual
)
select substr(s_string, f_f - s_f + length(delimiter), s_f-Length(delimiter ) )
from (select f_f
, s_f
from(select f_f
, f_f - lag(f_f, 1, f_f) over(order by 1) s_f
from (select Instr(s_string, delimiter , 1, level) f_f
from SourceString
connect by level <= Length(s_string))
)
where s_f > 0)
, SourceString