2012-04-16 110 views
2

我在postgreSQL中使用regex_replace並試圖去除字符串中不是字母或數字的任何字符。但是,使用此正則表達式:regex_replace不替換連字符/破折號

select * from regexp_replace('blink-182', '[^a-zA-Z0-9]*$', '') 

返回'blink-182'。連字符不會被刪除,並且不會像我所期望的那樣被替換爲('')。

我該如何修改這個正則表達式來替換hypen - 我已經測試過許多其他字符(!,。#),並且它們都被正確地替換了。

任何想法?

+0

難道不該'選擇REGEXP_REPLACE(...)'代替(替換功能在從部分並沒有真正意義) – 2012-04-16 14:05:29

+0

卸下'$'從最終拿起'-'但是,我認爲你需要這個。一般來說,如果你告訴我們你需要正則表達式,可能會更好。 – James 2012-04-16 14:05:39

回答

11

您目前替換字符串末尾的非字母數字字符的運行只有。我想你的測試主要是foobar!#這種形式的字符串,因爲要刪除的字符在字符串的末尾。

要替換的字符串在這樣一個字符的每一次出現從正則表達式中刪除$

[^a-zA-Z0-9]+ 

(也我改變了*+以防止每一個字符之間的零長度替換

如果你想保留空白,以及你需要把它添加到字符類:

[^a-zA-Z0-9 ]+ 

或可能

[^a-zA-Z0-9\s]+ 

如果在一開始的正則表達式實際上糾正,你只想從字符串末尾除去非字母數字字符,但你要刪除連字符,在零下字符串的中間(同時保留在字符串中間的其他非字母數字字符),那麼下面應該工作:

[^a-zA-Z0-9]+$|- 

maniek指出,你需要添加一個參數regexp_replace所以它會取代更多比一次匹配:

regexp_replace('blink-182', '[^a-zA-Z0-9]+$|-', '', 'g') 
+0

這似乎也刪除任何空白,但。有沒有辦法讓空白? – 2012-04-16 14:03:44

+2

當然,只需在字符類中添加空格即可。 – Joey 2012-04-16 14:04:33

+1

您需要'regexp_replace('blink-182','[^ a-zA-Z0-9] +','','g')',否則只會進行一次替換。 – maniek 2012-04-16 15:26:39