Oracle Regexp_substr 字符串

Oracle Regexp_substr String

我有像 a123bcd-e2343fg-hij-dfgh 这样的字符串 我想在 oracle 中使用 Regular_expression 输出 e2343fg-hij-dfgh

select regexp_substr('abcd-efg-hij','-[^-]+'1) from dual;
select substr('abcd-efg-hij',
               regexp_instr('abcd-efg-hij','-[^-]+')+1,length('abcd-efg-hij')) 
  from dual;

试试这个

您可以应用 regexp_substr[^-]+[-^] 模式,然后 ltrim 作为 :

select ltrim('a123bcd-e2343fg-hij-dfgh',
         regexp_substr('a123bcd-e2343fg-hij-dfgh','[^-]+[-^]')) as output_string        
  from dual;

或更好地调用绑定变量:

select ltrim('&str', regexp_substr('&str','[^-]+[-^]')) as output_string
  from dual;

其中 &str 可以在提示后替换为 a123bcd-e2343fg-hij-dfgh

Rextester Demo

为什么 正则表达式 ,当一个微不足道的 SUBSTR + INSTR 可以很好地快速完成工作时?没错,它看起来 更聪明,但我看不出任何其他好处。

SQL> with test (col) as
  2    (select 'a123bcd-e2343fg-hij-dfgh' from dual)
  3  select substr(col, instr(col, '-') + 1) result
  4  from test;

RESULT
----------------
e2343fg-hij-dfgh

SQL>

为了论证,regexp_replace 也适用。此正则表达式匹配第一个破折号之前的任何内容,并记住它 returns.

的其余部分
with tbl(str) as (
  select 'a123bcd-e2343fg-hij-dfgh' from dual
)
select regexp_replace(str, '^.*?-(.*)', '')
from tbl;

请记住,如果 regexp_substr() 没有找到匹配项,它 returns NULL 但如果 regexp_replace() 没有找到匹配项,它 return原始字符串。