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/-]/,"")