2014-01-30 116 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"

相关问题