如果我在查询下面运行,
select REGEXP_SUBSTR('->Total PCAT-Reporting->FSP->FSP->FSP->FSP-Non Partner->Default','[^->]+')
from dual
我得到 - Total PCAT
作为结果。
但我想要Total PCAT-Reporting
因为这是整个第一个字符串。
如何获得理想的结果?我不能做任何硬编码。
我尝试过以下查询,
select REGEXP_SUBSTR(REGEXP_REPLACE('->Total PCAT-Reporting->FSP->FSP->FSP->FSP-Non Partner->Default','-',''),'[^->]+')
from dual
这给了Total PCATReporting
,但我也想要连字符。
答案 0 :(得分:0)
您可以使用单个regexp_replace执行此操作,如下所示:
select regexp_replace('->Total PCAT-Reporting->FSP->FSP->FSP->FSP-Non Partner->Default', '->(.+?)->.*', '\1') new_str
from dual;
NEW_STR
--------------------
Total PCAT-Reporting
这使用非贪婪搜索来查找->
之间的任何字符,然后将其替换为第一个括号中的表达式 - ->
之间的字符。
答案 1 :(得分:0)
您可以使用非贪婪的 REGEXP_SUBSTR 来捕获所需的文本,然后通过 REGEXP_REPLACE
删除不必要的字符SELECT REGEXP_REPLACE(REGEXP_SUBSTR('->Total PCAT-Reporting->FSP->FSP->FSP->FSP-Non Partner->Default','[^->].+?((->)|$)', 1, 1), '->$', '')
FROM DUAL
答案 2 :(得分:0)
如果您能够将两个字符字段分隔符更改为一个(一个不会出现在字符串中的分隔符),则可以使用原始的REGEXP_SUBSTR。
select REGEXP_SUBSTR(str,'[^~]+' ,1,1),REGEXP_SUBSTR(str,'[^~]+' ,1,2),REGEXP_SUBSTR(str,'[^~]+' ,1,3) /*etc*/
from(
select regexp_replace('->Total PCAT-Reporting->FSP1->FSP2->FSP->FSP-Non Partner->Default', '->', '~') str from dual
)