提取连字符或破折号之间的字符

问题描述:

我需要提取连字符之间的字符,我尝试使用regexp_substr,但由于字符串不一致而遇到问题。提取连字符或破折号之间的字符

的字符串可以

111111-111103-ABCDEF--L00002 

123456-111111-ABCDEF-000000-111111 

111111-111103-ABCDEF-000002- 

第一套是资金, 次活动, 第三个帐户, 第四组织 和第五的位置

我能够使用REGEXP_SUBSTR为字符串第二个和第三个字符串,如下所示

select regexp_substr('123456-111111-ABCDEF-000000-111111','[^-]+',1,4) from dual; 

select regexp_substr('123456-111111-ABCDEF-000000-','[^-]+',1,5) from dual; 

并将正确的值分配给正确的字段。

但我有字符串123456-111111-ABCDEF - 111111的问题,第四个字段应该分配为空,但它拿起第五个值并将其分配给第四个。

select regexp_substr('123456-111111-ABCDEF--111111','[^-]+',1,4) from dual; 

有没有办法照顾' - '并只计算一个连字符?

谢谢!

+0

太谢谢你了!我错过了该解决方案。但是,该解决方案适用于|并且在我替换|时给我空白与 - ,但我修改我的字符串,使其工作。非常感谢您重新定向我! – user2088739

+0

如果字符串包含NULL元素并且应该避免,那么解析分隔字符串的格式为'[^ - ] +'的正则表达式将失败。有关详细信息,请参阅此文章:https://*.com/a/31464699/2543416。即对于位置:'从双重'选择regexp_substr('123456-111111-ABCDEF -111112','(。*?)( - | $)',1,5,NULL,1)位置;'。太糟糕了,问题被关闭了。 –

这假定字符串中的每个段都由' - '分隔。 这样做 ' - ' UR阿克尔:

select replace(regexp_substr('123456-111111-ABCDEF--111111' ,'[^-]*(-|$)',1,1), '-', '') from dual; 
select replace(regexp_substr('123456-111111-ABCDEF--111111' ,'[^-]*(-|$)',1,4), '-', '') from dual; 
select replace(regexp_substr('123456-111111-ABCDEF--111111' ,'[^-]*(-|$)',1,5), '-', '') from dual; 

看到http://sqlfiddle.com/#!4/5a13e/10

更新:更好的解决方案,而不附加虚拟 ' - ' 末

+0

非常感谢你! – user2088739

+0

plz检查我的答案是否正确 – elonderin