En primer lugar, hay que tener cuidado con gsub
y gsub!
. ¡Este último es "peligroso"! y modificará el valor de src
. Si está ejecutando estas declaraciones en orden, ser conscientes de que a.gsub!(/a/, "b")
y a = a.gsub(/a/, "b")
los dos para hacer lo mismo a a
. Parte del problema con su código es que src
está siendo modificado.
El método B vuelve "his"
pero no realiza cambios en source
src[/([a-z]+)/] # => "his"
src # => "This Is A 101 Test"
El método C elimina todos los caracteres que no son números:
src.gsub!(/\D/, "") # => "101"
src # => "101"
El método D no funciona porque la sintaxis es incorrecta El método gsub
acepta una expresión/cadena regular para buscar y luego una cadena para usar para el reemplazo. Si lo prueba en IRB actuará como si necesitara otro /
en algún lugar.
El método E reemplaza todos los caracteres no de texto y todos los números:
src.gsub(/(\W|\d)/, "") # => "This Is A Test" (note the two spaces)
src # => "This Is A 101 Test"
usted señala que se está volviendo ""
. Bueno, lo que está sucediendo realmente es que C y D como se indica (con problemas de sintaxis fijos) son destructivos cambios. (También, si se ejecuta en "101"
, D realmente volver nil
que no se realizaron sustituciones.) Por lo tanto E solo se ejecuta en "101"
, y puesto que usted está reemplazando todos los no-palabras y todos los números con ""
, se hace "101"
.
La respuesta que está buscando sería algo así como:
src.gsub!(/\d\s?/, "") # => "This Is A Test"
src # => "This Is A Test"
Y mi favorito para hacer frente a todos los escenarios de espacios dobles (porque squeeze
es bastante eficiente en la combinación de caracteres como, strip
es bastante eficiente en la extracción con espacios en blanco, y los !
retorno nil
si hacen sin suplentes):
src = src.gsub(/\d+/, "").squeeze(" ").strip
spot on. ¡Gracias! –