2012-02-02 13 views
14

quiero 'Esto es una prueba 101' ser 'Esta es una prueba', pero no puedo obtener el derecho de sintaxis.¿Cómo puedo eliminar caracteres que no sean palabras de un texto?

src = 'This Is A 101 Test' 
puts "A) " + src      # base => "This Is A 101 Test" 
puts "B) " + src[/([a-z]+)/]   # only does first word => "his" 
puts "C) " + src.gsub!(/\D/, "")  # Does digits, I want alphabetic => "101" 
puts "D) " + src.gsub!(/\W///g)  # Nothing. => "" 
puts "E) " + src.gsub(/(\W|\d)/, "") # Nothing. => "" 

Respuesta

27

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 
+0

spot on. ¡Gracias! –

4

¿Quieres cortar '101' de la cadena? Aquí tiene su expresión regular

src = 'This Is A 101 Test' 

puts src.gsub /\ \d+/, '' 
# => This Is A Test 

también que no entiendo por qué está utilizando la versión de la explosión gsub. gsub! modifica la cadena original, gsub lo copia y modifica la copia.

+0

No trabajo: 'pone "F)" + src.gsub/\ d +/'','^ –

+2

@MichaelDurrant: funciona. Tu cuerda ya no es lo que crees que es. Cambia 'gsub!' A 'gsub' y vuelve a intentarlo. –

+0

funcionó para mí. Hazlo exactamente como lo publicó. 'pone src.gsub (/ \\ d + /, '')'. Como dijo @SergioTulentsev, no deberías estar usando la versión 'bang' del método' gsub'. [Lea los documentos para la versión de bang] (http://ruby-doc.org/core-1.9.3/String.html#method-i-gsub-21), manipula la cadena original. – Batkins

3

¿Simplemente quiere borrar números? Si es así, src.gsub(/\d/,"") debería funcionar. La razón por la que no funciona arriba es ese gsub! modifica la cadena a la que se llama, por lo que después de C, src = "101" y eliminar todos los dígitos deja una cadena vacía.

Si desea eliminar todo menos los caracteres alfabéticos y espacios (es decir, dígitos y signos de puntuación), src.gsub(/(?=\S)(\d|\W)/,"") debería funcionar.

Si desea eliminar todo menos los caracteres alfabéticos (eliminando espacios, así como los dígitos y la puntuación), src.gsub(/\d|\W/,"") debería funcionar.

8

Para eliminar todos los "caracteres que no sean palabras", en su lugar puede guardar solo esos.

src = 'This Is A 101 Test' 
src.gsub(/[^a-zA-Z ]/,'').gsub(/ +/,' ') 
=> "This Is A Test" 

recomiendo Rubular para probar expresiones regulares de Ruby.

+1

+1 por rubular, ¡es increíble! –

7

Sin expresión regular:

src = 'This Is A 101 Test' 
src.delete('^a-zA-Z ') #the^negates everything 
Cuestiones relacionadas