ORACLE regexp_substr提取特定字符后的所有内容

时间:2018-10-26 08:49:56

标签: sql regex oracle

如何在特定字符后获取其余的字符串?

我有一个字符串'a|b|c|2|:x80|3|rr|',我想在第三次出现|之后得到结果。因此结果应类似于2|:x80|3|rr|

查询

select REGEXP_SUBSTR('a|b|c|2|:x80|3|rr|','[^|]+$',1,4) 
from dual

返回我为空

5 个答案:

答案 0 :(得分:2)

使用SUBSTR / INSTR组合

WITH t ( s ) AS (
     SELECT 'a|b|c|2|:x80|3|rr|'
     FROM dual
) SELECT substr(s,instr(s,'|',1,3) + 1)
  FROM t;

Demo

答案 1 :(得分:0)

我建议通过将regexp_substrregexp_countlistagg一起使用作为一个好方法,

select listagg(str) within group (order by lvl) 
       as "Result String"
  from
(
  with t(str) as
  (
   select 'a|b|c|2|:x80|3|rr|' from dual
  )
  select level-1 as lvl,
         regexp_substr(str,'(.*?)(\||$)',1,level) as str 
    from dual
    cross join t
   connect by level <= regexp_count('a|b|c|2|:x80|3|rr|','\|')
)
where lvl >= 3;

Rextester Demo

答案 2 :(得分:0)

REGEXP_REPLACE()将解决问题。跳过3组,然后再接上管道,然后替换为第二组,这是该行的其余部分(固定在最后)。

SQL> select regexp_replace('a|b|c|2|:x80|3|rr|', '(.*?\|){3}(.*)$', '\2') trimmed
  2  from dual;

TRIMMED
------------
2|:x80|3|rr|

SQL>

答案 3 :(得分:0)

如果您使用的是oracle 11g及更高版本,则可以指定一个子表达式来返回,如下所示:

F. public static <? extends T> List<T> backwards(List<T> input)
G. public static <? super T> List<T> backwards(List<T> input)

答案 4 :(得分:0)

Erkko, 您需要使用-ugit pushSUBSTR的组合。

您的查询将如下所示。 (不使用正则表达式)
REGEXP_INSTR

您的查询将如下所示。 (要使用正则表达式) INSTR

说明:

首先,您将需要找到您要提到的字符串的位置。因此,在您的情况下,SELECT SUBSTR('a|b|c|2|:x80|3|rr|',INSTR('a|b|c|2|:x80|3|rr|','|',1,3)+1) from dual;位于第6位。因此+1将是您开始使用子字符串的位置。

第二,从原始字符串开始,从该位置+1到无限的子字符串。(字符串结束的地方)

示例:
https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=6fd782db95f575201eded084493232ee