regexp_substr 去掉第一个正斜杠和第二个正斜杠之间的文本

regexp_substr strip text between first forward slash and second one

/abc/required_string/2/ 应该 return abc 和 regexp_substr

你可以搜索/([^/]+)/,上面写着:

  • / 正斜杠
  • ( 子表达式的开始(在其他语言中通常称为 "group")
    • [^/] 除正斜杠外的任何字符
    • + 匹配前面的表达式一次或多次
  • ) 子表达式结束
  • / 正斜杠

你可以使用第 6 个参数来 regexp_substr 到 select 一个子表达式。 这里我们传递 1 以仅匹配 / 之间的字符:

select  regexp_substr(txt, '/([^/]+)/', 1, 1, null, 1)
from    t1

See it working at SQL Fiddle.

SELECT REGEXP_SUBSTR ('/abc/blah/blah/', '/([a-zA-Z0-9]+)/', 1, 1, NULL, 1) first_val 
from dual;

经典 SUBSTR + INSTR 提供了一个简单的解决方案;我知道您指定了正则表达式,但是 - 也考虑一下,对于大数据量可能 更好

SQL> with test (col) as
  2    (select '/abc/required_string/2/' from dual)
  3  select substr(col, 2, instr(col, '/', 1, 2) - 2) result
  4  from test;

RES
---
abc

SQL>

这是另一种获取字符串中第 2 次出现且后跟正斜杠的方法。如果该元素也恰好为 NULL,它会处理该问题。总是期待意想不到的事情!

注意:如果您使用 [^/]+ 的正则表达式形式,并且该元素为 NULL,它将 return "required string" 这不是您所期望的!该表单不处理 NULL 元素。有关更多信息,请参见此处:[

with tbl(str) as (
  select '/abc/required_string/2/' from dual union all
  select '//required_string1/3/' from dual
)
select  regexp_substr(str, '(.*?)(/)', 1, 2, null, 1)
from    tbl;

您可以尝试以下方法:

SELECT TRIM('/' FROM REGEXP_SUBSTR(mycolumn, '^\/([^\/]+)'))
  FROM mytable;

这个正则表达式将匹配第一次出现的以 / 开头的模式(我习惯性地在正则表达式中转义 /,因此 \/ 不会造成任何伤害)并包括后面的任何非 / 字符。如果没有这样的字符,那么它将 return NULL.

希望这对您有所帮助。