正则表达式:获取“路径”的倒数第二部分

时间:2019-10-10 20:59:07

标签: regex oracle

我有这样的东西:

>AAA>BBB>CCC>DDD

使用

([^>]*$)

我得到了最后一部分DDDCCC我该如何获得零件?

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以使用

REGEXP_SUBSTR('>AAA>BBB>CCC>DDD', '([^>]+)>[^>]+$', 1, 1, NULL, 1)

([^>]+)>[^>]+$正则表达式将匹配并将>以外的任何1个以上的字符捕获到组1中,然后匹配>,再匹配>以外的任何1个以上的字符直到字符串的末尾。

最后一个参数1告诉REGEXP_SUBSTR仅返回捕获的子字符串。

请参见online demo

另一种方法是替换整个字符串,但保留选择的捕获部分:

REGEXP_REPLACE( '>AAA>BBB>CCC>DDD', '.*>([^>]+)>[^>]+$', '\1')

看到另一个online demo

在这里,.*>将匹配所有字符串,直到>,然后([^>]+)将捕获>以外的任何1个以上的字符,然后捕获>[^>]+$将匹配并消耗>和字符串末尾>以外的1个以上的字符。

答案 1 :(得分:1)

您不需要正则表达式-标准的字符串函数就足够了,它们会更快。

在最后一个示例中,请注意没有“倒数第二个”或倒数第二个部分;因此输出为NULL。在那种情况下,那确实是正确的答案。

with
  test_data (pth) as (
    select '>AAA>BBB>CCC>DDD' from dual union all
    select null               from dual union all
    select '>EEE>GGG'         from dual union all
    select '>JJJJJ'           from dual
  )
select pth,
       substr(pth, instr(pth, '>', -1, 2) + 1, 
              instr(pth, '>', -1, 1) - instr(pth, '>', -1, 2) - 1) as stl
from   test_data
;

PTH               STL             
----------------  ----------------
>AAA>BBB>CCC>DDD  CCC             

>EEE>GGG          EEE             
>JJJJJ                           

答案 2 :(得分:1)

对于您的Oracle版本中缺少对返回子表达式的支持,这是一个愚蠢的解决方法。我只是出于好奇而提出。我提出了一个更好的解决方案,在单独的Answer中根本不使用正则表达式。

with
  test_data (pth) as (
    select '>AAA>BBB>CCC>DDD' from dual union all
    select null               from dual union all
    select '>EEE>GGG'         from dual union all
    select '>JJJJJ'           from dual
  )
select pth, 
       regexp_substr(pth, '[^>]*', 1, nullif(2*regexp_count(pth, '>')-2, 0)) as stl
from   test_data
;

PTH              STL             
---------------- ----------------
>AAA>BBB>CCC>DDD CCC             

>EEE>GGG         EEE             
>JJJJJ