我有这样的东西:
>AAA>BBB>CCC>DDD
使用
([^>]*$)
我得到了最后一部分DDD
。 CCC
我该如何获得零件?
谢谢!
答案 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