【发布时间】:2015-11-16 16:41:06
【问题描述】:
我必须从一个特殊字符(比如 -)出现的第 n 次和第 m 次之间的表中选择一个子字符串。
例如:如果列数据为 'abcdefgh',则 n 为 2 & m 为 5,我的选择语句应该返回:'cde'
我尝试了各种正则表达式组合,但我认为 '\K' 不能使用。
请帮忙。
【问题讨论】:
标签: regex oracle oracle11g substring
我必须从一个特殊字符(比如 -)出现的第 n 次和第 m 次之间的表中选择一个子字符串。
例如:如果列数据为 'abcdefgh',则 n 为 2 & m 为 5,我的选择语句应该返回:'cde'
我尝试了各种正则表达式组合,但我认为 '\K' 不能使用。
请帮忙。
【问题讨论】:
标签: regex oracle oracle11g substring
您可能想尝试像这样使用instr:
with PARAM as (select 'a-b-c-d-e-f-g-h' as S,
'-' as D, 2 as N, 5 as M from dual)
select substr(substr(S, instr(S, D, 1, N) + 1),
1, instr(S, D, 1, M - N) - 1) as RANGE
from PARAM;
with 语句只是为了使表达式更清晰。
S 是输入字符串。 D 是分隔符。
如果你想要使用正则表达式,那么你可以试试这个:
with PARAM as (select 'a-b-c-d-e-f-g-h' as S,
'-' as D, 2 as N, 5 as M from dual)
select -- ^([^D]*D){N}([^D]*(D[^D]*){M-N-1}).*$
regexp_replace(S, '^([^'||D||']*'||D||'){'||N||'}([^'||D||']*('||D||'[^'||D||']*){'||(M-N-1)||'}).*$', '\2') as RANGE
from PARAM;
正则表达式从跳过 N 文本组和分隔符 (([^D]*D){N}) 开始,然后形成一组 \2 一个文本,然后是 M-N-1 文本组和分隔符 (([^D]*(D[^D]*){M-N-1})。
在正则表达式方法中,正则表达式中具有特殊含义的分隔符必须被引用。
【讨论】:
您可以尝试以下方法:
从对偶中选择 substr('a-b-c-d-e-f-g-h',instr('a-b-c-d-e-f-g-h','-',1,2)+1,5) 作为出现;
【讨论】: