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
Tu peux le faire
a.gsub!(/[^0-9A-Za-z]/, '')
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 ]/,'')
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.
gsub
est l'une des méthodes Ruby les plus utilisées dans la nature.
specialname="Hello!#$@"
cleanedname = specialname.gsub(/[^a-zA-Z0-9\-]/,"")
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