La suppression de tous les caractères spéciaux d'une chaîne de rubis

je faisais les défis de pythonchallenge l'écriture de code en ruby, précisément ce. Il contient une très longue chaîne de caractères dans la page source avec des caractères spéciaux. J'essayais de trouver un moyen de les supprimer ou de vérifier les caractères alphabétique.

j'ai essayé d'utiliser la méthode de balayage, mais je pense que je pourrais ne pas l'utiliser correctement. J'ai aussi essayé delete! comme ça:

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

Comment puis-je le faire?

Merci

42
demandé sur Chad Bingham 2014-01-30 05:47:45

6 réponses

Vous pouvez le faire

a.gsub!(/[^0-9A-Za-z]/, '')
100
répondu Alok Anand 2014-01-30 05:50:19

essayez avec gsub

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

essayez le regexp sur rubular.com

si vous voulez quelque chose de plus général vous pouvez avoir une chaîne avec des caractères valides et supprimer ce qui n'est pas là:

a.gsub!(/[^abcdefghijklmnopqrstuvwxyz ]/,'')
10
répondu arieljuod 2014-01-30 01:58:00

lorsque vous donnez plusieurs arguments à string#delete, c'est l'intersection de ces arguments est supprimé. a.delete! "!", "@" supprime les intersections des ensembles ! et @ ce qui signifie que rien ne sera supprimé et que la méthode retourne nil.

Ce que tu voulais faire a.delete! "!@" avec les caractères à supprimer passé comme une seule chaîne.

puisque le défi est de nettoyer le désordre et de trouver un message dedans, je dirais liste blanche au lieu de supprimer des caractères spéciaux. La méthode delete accepte les plages avec - et négations avec ^ (semblable à un regex) de sorte que vous pouvez faire quelque chose comme ceci: a.delete! "^A-Za-z ".

vous pouvez aussi utiliser des expressions régulières comme le montre @arieljuod.

5
répondu dee-see 2014-01-30 02:21:15

gsub est l'une des méthodes Ruby les plus utilisées dans la nature.

specialname="Hello!#$@"
cleanedname = specialname.gsub(/[^a-zA-Z0-9\-]/,"") 
5
répondu Pradeep 2014-01-30 15:53:41

si vous ne voulez pas changer la chaîne d'origine, c'est - à-dire résoudre le défi.

str.each_char do |letter|
  if letter =~ /[a-z]/  
    p letter    
  end  
end  
2
répondu AGS 2014-01-30 02:32:06

je pense que a.gsub(/[^A-Za-z0-9 ]/, '') fonctionne mieux dans ce cas. Sinon, si vous avez une phrase, qui généralement devrait commencer avec une lettre majuscule, vous perdrez votre lettre majuscule. Vous perdez également toute 1337 speak, ou d'autres cryptes dans le texte.

exemple:

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"

0
répondu ThaDick 2017-05-11 18:10:51