2017-07-16 74 views
0

我需要提取連字符之間的字符,我嘗試使用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://stackoverflow.com/a/31464699/2543416。即對於位置:'從雙重'選擇regexp_substr('123456-111111-ABCDEF -111112','(。*?)( - | $)',1,5,NULL,1)位置;'。太糟糕了,問題被關閉了。 –

回答

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