web-dev-qa-db-fra.com

Supprimer tous les caractères spéciaux d'une chaîne - ruby

Je faisais les défis de pythonchallenge écriture de code en Ruby, en particulier celui-ci . Il contient une très longue chaîne dans le source de la page avec des caractères spéciaux. J'essayais de trouver un moyen de les supprimer/vérifier les caractères alphabétiques. 

J'ai essayé d'utiliser la méthode de numérisation, mais je pense 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 faire ça? 

Merci

44
kwoskowicz

Tu peux le faire 

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

essayez avec gsub

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

essayez l'expression rationnelle 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 enlever ce qui ne se trouve pas dedans:

a.gsub!(/[^abcdefghijklmnopqrstuvwxyz ]/,'')
10
arieljuod

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

Ce que vous vouliez faire, c'est a.delete! "!@" avec les caractères à supprimer transmis en tant que chaîne unique.

Étant donné que le défi consiste à nettoyer le gâchis et à y trouver un message, je choisirais une liste blanche au lieu de supprimer des caractères spéciaux. La méthode delete accepte les plages avec - et les négations avec ^ (semblable à une expression rationnelle) afin que vous puissiez faire quelque chose comme ceci: a.delete! "^A-Za-z ".

Vous pouvez également utiliser des expressions régulières, comme indiqué par @arieljuod.

5
dee-see

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
Pradeep

Si vous ne souhaitez pas modifier la chaîne d'origine, c’est-à-dire résoudre le problème.

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