2014-01-30 117 views
40

我正在從pythonchallenge以ruby編寫代碼,specifically this one中遇到挑戰。它包含頁面源代碼中包含特殊字符的非常長的字符串。我試圖找到一種方法來刪除它們/檢查字母字符。刪除字符串中的所有特殊字符 - ruby​​

我試過使用掃描方法,但我想我可能不會正確使用它。我也試過delete!那樣:

a = "PAGE SOURCE CODE PASTED HERE" 
    a.delete! "!", "@" #and so on with special chars, does not work(?) 
    a 

我該怎麼做?

感謝

回答

94

你可以做到這一點

a.gsub!(/[^0-9A-Za-z]/, '') 
9

嘗試GSUB

a.gsub!(/[[email protected]%&"]/,'') 

嘗試rubular.com

正則表達式,如果你想要更多的東西一般你可以有有效的字符字符串,刪除什麼有沒有:

a.gsub!(/[^abcdefghijklmnopqrstuvwxyz ]/,'') 
+5

爲什麼不'[^ a-z]'? – Vache

+0

當然,這是更好的 – arieljuod

+0

我認爲在這種情況下''[^ A-Za-z]'效果更好。否則,如果你有一個句子,典型的**應該**以大寫字母開頭,你將失去你的大寫字母。你也會失去文本中的任何'1337說話'或其他可能的隱匿。 案例: 'phrase =「Joe無法區分」大「和」大「。 =>「喬不能分辨」大「和」大「。」 – ThaDick

5

當你給多個參數string#delete,它是那些被刪除的參數的交集。 a.delete! "!", "@"刪除集合!@的交集,這意味着什麼都不會被刪除,並且方法返回nil

你想要做的是將a.delete! "[email protected]"與要刪除的字符作爲單個字符串傳遞。

由於挑戰是要求清理混亂並在其中找到消息,因此我會使用白名單而不是刪除特殊字符。刪除方法接受範圍-和否定與^(類似於正則表達式),所以你可以做這樣的事情:a.delete! "^A-Za-z "

您還可以使用@arieljuod所示的正則表達式。

2

如果您不想更改原始字符串 - 即解決挑戰。

str.each_char do |letter| 
    if letter =~ /[a-z]/ 
    p letter  
    end 
end 
5

gsub是在野外最常用的Ruby方法之一。

​​
0

我認爲a.gsub(/[^A-Za-z0-9 ]/, '')在這種情況下效果更好。否則,如果您有一句話,其中通常應該以大寫字母開頭,您將失去您的大寫字母。您也將失去文本中的任何1337 speak或其他可能的隱藏。

案例:

phrase = "Joe can't tell between 'large' and large." => "Joe can't tell between 'large' and large."

phrase.gsub(/[^a-z ]/, '') => "oe cant tell between large and large"

phrase.gsub(/[^A-Za-z0-9 ]/, '') => "Joe cant tell between large and large"

phrase2 = "W3 a11 f10a7 d0wn h3r3!" phrase2.gsub(/[^a-z ]/, '') => " a fa dwn hr"

phrase2.gsub(/[^A-Za-z0-9 ]/, '') => "W3 a11 f10a7 d0wn h3r3"

相關問題