2011-01-10 26 views

Respuesta

52

Sólo para recordar a la gente buena 'ol tr:

asdf.tr('^A-Za-z0-9', '') 

que está encontrando el complemento de los rangos de caracteres y la traducción de los caracteres a ''.

tenía curiosidad si el uso de una clase \W carácter era más rápido que los rangos y gsub vs tr:

require 'benchmark' 

asdf = [('A'..'z').to_a, ('0'..'9').to_a].join 

puts asdf 
puts asdf.tr( '^A-Za-z0-9', '') 
puts asdf.gsub(/[\W_]+/,  '') 
puts asdf.gsub(/\W+/,   '') 
puts asdf.gsub(/\W/,   '') 
puts asdf.gsub(/[^A-Za-z0-9]+/, '') 
puts asdf.scan(/[a-z\d]/i).join 

n = 100_000 
Benchmark.bm(7) do |x| 
    x.report("tr:") { n.times do; asdf.tr('^A-Za-z0-9', '');  end } 
    x.report("gsub1:") { n.times do; asdf.gsub(/[\W_]+/, '');  end } 
    x.report("gsub2:") { n.times do; asdf.gsub(/\W+/, '');   end } 
    x.report("gsub3:") { n.times do; asdf.gsub(/\W/, '');   end } 
    x.report("gsub4:") { n.times do; asdf.gsub(/[^A-Za-z0-9]+/, ''); end } 
    x.report("scan:") { n.times do; asdf.scan(/[a-z\d]/i).join;  end } 
end 

>> ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz
>> ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
>> ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
>> ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz
>> ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz
>> ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
>> ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
>>    user  system  total  real 
>> tr:  0.560000 0.000000 0.560000 ( 0.557883) 
>> gsub1: 0.510000 0.000000 0.510000 ( 0.513244) 
>> gsub2: 0.820000 0.000000 0.820000 ( 0.823816) 
>> gsub3: 0.960000 0.000000 0.960000 ( 0.955848) 
>> gsub4: 0.900000 0.000000 0.900000 ( 0.902166) 
>> scan: 5.630000 0.010000 5.640000 ( 5.630990) 

Se puede ver un par de los patrones no están alcanzando el '_', que forma parte de \w, y, como resultado, no cumple con la solicitud del OP.

+1

Por favor, agregue 'eliminar' a su punto de referencia. – Nakilon

+0

+1, muchas gracias – abhijit

+0

¿Has probado ** asdf.gsub (/ [\ W _] /, '') ** sin el '+'? ¿Difiere? – rafaelkin

7
=> '^/how/now#(Brown) Cow'.gsub /\W/, '' # or /[\W_]/ 
=> "hownowBrownCow" 

... actualizado basado en los comentarios ...

+0

+1 para HNBC. :) –

+1

No elimina los guiones bajos, lo que puede ser algo bueno. – steenslag

+2

O simplemente puede usar '.gsub/\ W /, ''', ya que \ W coincide con cualquier carácter que no sea de palabra (mientras \ w coincide con los caracteres de las palabras). –

20

Sin una expresión regular:

garbage = 'ab_c<>?AB [email protected]#123' 
puts garbage.delete("^a-zA-Z0-9") #=> abcABC123 

En la que el '^' niega todo después de ella.

+0

Guau, ¿desde cuándo 'borrar' puede'^'? No lo veo en mis documentos 1.9.2. – Nakilon

+0

algunos votos a favor para compensar por su consejo útil – apneadiving

Cuestiones relacionadas