Oracle 11g:nth&之间的子串发生了

时间:2015-08-23 01:13:49

标签: regex oracle oracle11g substring

我必须在特殊字符的第n和第n次出现之间从表中选择一个子字符串(比如 - )。

例如:如果列数据是' a-b-c-d-e-f-g-h ', n 2 & m 5 ,我的select语句应返回:' c-d-e '

我尝试了各种正则表达式组合,但我认为' \ K'不能使用。

请帮忙。

2 个答案:

答案 0 :(得分:3)

您可能想尝试使用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})。

在正则表达式方法中,必须引用正则表达式中具有特殊含义的分隔符。

答案 1 :(得分:0)

您可以尝试以下方法:

选择substr(' abcdefg-h',instr(' abcdefg-h',' - ',1,2)+1,5)从双重出现;