2015-04-12 305 views
0

我有一個帶有這個分隔符' - '的字符串(連字符被空格包圍)。 我沒有問題,得到的字符串的各個部分:用正則表達式分隔符分割字符串

select regexp_substr(val, '[^-]+', 1, 1), 
     regexp_substr(val, '[^-]+', 1, 2) 
from (select 'first - second' as val from dual) t 

但是我想排除的每個項和連字符之間的空格。我試過這個:

regexp_substr(val, '[^\s-]+', 1, 1) 
regexp_substr(val, '[^-\s]+', 1, 2) 

但它似乎沒有工作。第一個表達式返回fir,

1)我想知道爲什麼? 這裏是鏈接到小提琴:

http://www.sqlfiddle.com/#!4/d41d8/41570

2)我怎樣才能解決這個問題?

回答

0

如果你想使你不需要否定的字符類來分割你的字符串,你可以用以下方式劃分:

'[\s-]+' 

如果你只是想找到的話,你可以使用:

\b[a-zA-Z]+\b 
+0

謝謝卡斯拉,但我無法使用您的正則表達式檢索正確的結果。你如何在我的情況下使用它們? – kaligne

0

如果你想從開頭和結尾刪除空格,那麼我認爲最簡單的方法是使用trim()

select trim(regexp_substr(val, '[^-]+', 1, 1)), 
     trim(regexp_substr(val, '[^-]+', 1, 2)) 
from (select 'first - second' as val from dual) t 
+0

謝謝你,修飾funciton做的伎倆,所以我使用它!然而,如果沒有修整,解決這個問題的可能正則表達式是什麼? – kaligne

0

捕捉你的目標在一組,並有函數返回的是:

select regexp_substr(val, '(.*) *- *', 1, 1, '', 1), 
    regexp_substr(val, ' *- *(.*)', 1, 1, '', 1) 
from (select 'first - second' as val from dual) t 

SQLFiddle

這可以讓你表達更精確的分隔符。這種技術是使用向前看表達式的下一個最好的事情,這將是支持它的正則表達式引擎中最受歡迎的方法,而Oracle不支持這種方法。

爲了解釋這是怎麼回事,目標是捕獲使用支架,它採用反向引用返回 - 最後一個參數 - 命名組1(第一組表達的)歸還。

FYI組0是整個匹配。

相關問題