2010-08-05 229 views
0

我想要提供一個正則表達式來刪除除某些字符以外的所有特殊字符。例如,我有一個字符串:刪除除一些特殊字符以外的所有字符

str = "subscripción gustaría♥" 

我想輸出爲"subscripción gustaría"

我試圖做的是,匹配任何不是ascii字符(00 - 7F)而不是我想要的特殊字符,並將其替換爲空白。

str.gsub(/(=?[^\x00-\x7F])(=?^\xC3\xB3)(=?^\xC3\xA1)/,'') 

這不起作用。最後一個特殊字符不會被刪除。

有人可以幫忙嗎? (這是紅寶石1.8)

更新:我試圖讓問題更清楚一點。該字符串是utf-8編碼的。我試圖將ascii角色加上ó和í,將其他所有內容列入黑名單。

回答

1
str.split('').find_all {|c| (0x00..0x7f).include? c.ord }.join('') 
+0

不,這刪除了所有的特殊字符。我只想♥被刪除,而不是ó和í – maheshmurthy 2010-08-05 22:38:07

1

這個問題有點含糊。關於字符串的編碼沒有一個字。此外,你想白名單字符或黑名單?哪個? 但是你明白了,決定你想要什麼,然後使用適當的範圍作爲這裏已經提出的同事。一些例子: 如果str = 「subscripcióngustaría♥」 是UTF-8 則可以黑名單上述範圍內的所有字符(不包括空格):

 str.gsub(/[^\x{0021}-\x{017E}\s]/,'') 

如果字符串是在ISO-8859-1代碼頁你可以嘗試搭配就像從ASCII範圍開始的「心臟」的所有文字古怪:

str.gsub(/[\x01-\x1F]/,'') 

的問題是在這裏與正則表達式,無關與紅寶石。您可能需要嘗試更多。

+0

是的,我的壞,我應該提到它是utf-8編碼。我明白你的意思。我正在嘗試將6個特殊字符列入白名單。所以,我試圖得到的是「如果不在00-7F範圍內而不是\ xC3 \ xB3而不是\ xC3 \ xA1」,那麼將其替換爲空白。 當我嘗試上述解決方案時,出現語法錯誤。它不喜歡大括號。 – maheshmurthy 2010-08-05 23:47:10

+1

黑名單是一個壞主意。誰知道可能會在那裏。你明確地說出你會接受什麼,這樣就沒有驚喜。 – 2010-08-05 23:52:41

+0

是的,我也不好,我在用PHP的想法,很抱歉我的壞的正則表達式。 看看馬克威爾金斯的答案,我測試了它,它在這個例子中起作用。 – Ernest 2010-08-06 00:19:52

0

這並不完全清楚你想保留哪些字符以及你想刪除哪些字符。示例字符串的字符是一些Unicode字符,在我的瀏覽器中顯示爲心臟符號。但似乎你正在處理8位ASCII字符(因爲你使用的是Ruby 1.8,而你的正則表達式就是這樣指向的)。

儘管如此,你應該能夠以兩種方式之一來完成它;要麼指定要保留的字符,要麼指定要刪除的字符。例如,下面指定所有字符爲0x00-0x7F和0xC0-0xF6應保持(刪除一切,是不是該組中):

puts str.gsub(/[^\x00-\x7F\xC0-\xF6]/,'') 

下一個例子指定字符0xA1和0xC3應予刪除。

puts str.gsub(/[\xA1\xC3]/,'') 
2

Oniguruma支持您關心的所有字符而無需處理代碼點。您可以在要加入白名單的字符類中添加unicode字符,然後加上'u'選項。

ruby-1.8.7-p248 > str = "subscripción gustaría♥" 
=> "subscripci\303\263n gustar\303\255a\342\231\245" 
ruby-1.8.7-p248 > puts str.gsub(/[^a-zA-Z\sáéíóúÁÉÍÓÚ]/u,'') 
subscripción gustaría 
=> nil 
0

我結束了這樣做的:str.gsub(/ [^ \ x00- \x7FÁáÉéÍíÑñÓóÚúÜü] /, '')。它不適用於我的Mac,但適用於Linux。

+0

然後你應該看看我的答案,它適用於我的Mac,並且不匹配字節,這可能最終導致你的錯誤。 – 2010-08-17 14:34:11