2013-05-19 66 views
0

鑑於串12,.34.56如何「不包括」一些片在正則表達式模式

我需要分割的點此字符串(.),但只能通過這些點,其中前一個字符是不是逗號(,

也就是說,從上面的字符串,必須檢索結果

12,.34 
56 

我想這一點:

SELECT regexp_split_to_table('12,.34.56', E'[^,]\\\.')

這將返回:

12,.3 
    56 

正如我們看到的,符號4被刪除,原因理解:[^,]手段「一些符號」除了逗號,在這種情況下,「一些符號」被打開4

問題:如何防止這種情況?如何不包括這件作品:[^,]的模式?

+0

這將是正則表達式:'/(?

+0

感謝您的回答。 – RIKI

回答

2

,因爲這不是由Postgres的正則表達式的支持,解決辦法是用字符的另一個(唯一的)組合來代替,.,之後再轉換回:

SELECT replace(unnest(string_to_array(
       replace('12,.34.56.78,.34', ',.','~^~'), '.')), '~^~', ',.') 
我也使用 unnest(sting_to_array())代替 regexp_split_to_table()因爲

它表現出更好的規模。

2

這被稱爲否定後視聲明。不幸的是PostgreSQL doesn't support these in its regular expression implementation

你可以通過使用更復雜的查詢來解決這個問題......正如Erwin剛剛發佈的那樣,我正在寫這個。

雖然PostgreSQL的本地正則表達式實現不支持此功能,PL/perl做,所以你可以使用PL/Perl來執行更復雜的正則表達式任務時,你無法找到使用PostgreSQL的更簡單,更高效的解決方法內置插件。