regulares - Borrar todos los caracteres especiales de una cadena-ruby
expresiones regulares ruby on rails (6)
Estaba haciendo los desafíos de pythonchallenge escribiendo código en ruby, específicamente este . Contiene una cadena muy larga en la fuente de la página con caracteres especiales. Estaba tratando de encontrar una manera de eliminarlos / verificar los caracteres alfabéticos.
Intenté usar el método de escaneo, pero creo que podría no usarlo correctamente. También intenté delete!
como eso:
a = "PAGE SOURCE CODE PASTED HERE"
a.delete! "!", "@" #and so on with special chars, does not work(?)
a
¿Cómo puedo hacer eso?
Gracias
Creo que a.gsub(/[^A-Za-z0-9 ]/, '''')
funciona mejor en este caso. De lo contrario, si tiene una oración, que normalmente debería comenzar con una letra mayúscula, perderá su letra mayúscula. También perdería 1337 speak
, u otras posibles criptas dentro del texto.
Caso en punto:
phrase = "Joe can''t tell between ''large'' and large." => "Joe can''t tell between ''large'' and large."
phrase.gsub(/[^az ]/, '''') => "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(/[^az ]/, '''') => " a fa dwn hr"
phrase2.gsub(/[^A-Za-z0-9 ]/, '''') => "W3 a11 f10a7 d0wn h3r3"
Cuando le das múltiples argumentos a la string#delete
, es la intersección de esos argumentos que se elimina. a.delete! "!", "@"
a.delete! "!", "@"
elimina las intersecciones de los conjuntos !
y @
que significa que no se eliminará nada y el método devuelve nil
.
¡Lo que querías hacer es a.delete! "!@"
a.delete! "!@"
con los caracteres a eliminar pasados como una sola cadena.
Ya que el desafío es pedir que se limpie el desorden y encontrar un mensaje en él, me gustaría ir con una lista blanca en lugar de eliminar caracteres especiales. El método de eliminación acepta rangos con -
y negaciones con ^
(similar a una expresión regular) para que pueda hacer algo como esto: a.delete! "^A-Za-z "
a.delete! "^A-Za-z "
.
También puede usar expresiones regulares como se muestra en @arieljuod.
Puedes hacerlo
a.gsub!(/[^0-9A-Za-z]/, '''')
Si no desea cambiar la cadena original, es decir, para resolver el desafío.
str.each_char do |letter|
if letter =~ /[a-z]/
p letter
end
end
prueba con gsub
a.gsub!(/[!@%&"]/,'''')
prueba la expresión regular en rubular.com
Si quieres algo más general, puedes tener una cadena con caracteres válidos y eliminar lo que no está allí:
a.gsub!(/[^abcdefghijklmnopqrstuvwxyz ]/,'''')
gsub
es uno de los métodos de Ruby más utilizados en la naturaleza.
specialname="Hello!#$@"
cleanedname = specialname.gsub(/[^a-zA-Z0-9/-]/,"")