2010-11-17 13 views

Respuesta

222

Si los caracteres que desea eliminar son siempre los mismos caracteres, y luego considerar chomp:

'abc123'.chomp('123') # => "abc" 

Las ventajas de chomp son: no contar, y el código se comunica con más claridad lo que está haciendo.

Sin argumentos, chomp elimina el final de línea DOS o Unix, si cualquiera de estos casos:

"abc\n".chomp  # => "abc" 
"abc\r\n".chomp # => "abc" 

De los comentarios, no era una cuestión de la velocidad de la utilización de #chomp frente a la utilización de una distancia. Aquí es un punto de referencia la comparación de los dos:

require 'benchmark' 

S = 'asdfghjkl' 
SL = S.length 
T = 10_000 
A = 1_000.times.map { |n| "#{n}#{S}" } 

GC.disable 

Benchmark.bmbm do |x| 
    x.report('chomp') { T.times { A.each { |s| s.chomp(S) } } } 
    x.report('range') { T.times { A.each { |s| s[0...-SL] } } } 
end 

Resultados de referencia (utilizando CRuby 2.13p242):

Rehearsal ----------------------------------------- 
chomp 1.540000 0.040000 1.580000 ( 1.587908) 
range 1.810000 0.200000 2.010000 ( 2.011846) 
-------------------------------- total: 3.590000sec 

      user  system  total  real 
chomp 1.550000 0.070000 1.620000 ( 1.610362) 
range 1.970000 0.170000 2.140000 ( 2.146682) 

Así Chomp es más rápido que el uso de una gama, por ~ 22%.

+5

Chop también es una opción. Es menos quisquilloso sobre lo que se elimina. –

+0

algorítmicamente, ¿no sería algo así como [0 ..- #] más rápido? un chomp tiene que analizar una cuerda buscando fósforos. Excluir y finalizar el número de char no. – Plasmarob

+0

@Plasmarob, eso sería una buena referencia. –

47
str = str[0...-n] 
+5

Tenga en cuenta que esto sólo funciona en Ruby 1.9. En Ruby 1.8, esto eliminará los últimos * bytes *, no los últimos * caracteres *. –

+5

Esto es mejor que la respuesta elegida, ya que 3 puntos (...) es más fácil de memorizar ya que -n significa sacar n caracteres del final de la cadena. – lulalala

+0

también "abcd" [0 ..- 2] # => "abc" mientras que "abcd" [0 ...- 2] # => "ab". En mi opinión, la opción de rango de 3 puntos resulta en un código más explicativo. – mokagio

277
irb> 'now is the time'[0...-4] 
=> "now is the " 
+7

Tenga en cuenta que esto solo funciona en Ruby 1.9. En Ruby 1.8, esto eliminará los últimos * bytes *, no los últimos * caracteres *. –

+2

Pero probablemente quiso decir * "bytes" * si usa 1.8.x. – DigitalRoss

+3

Esto funciona, pero estoy descubriendo que 'abc123'.chomp (' 123 ') es el doble de rápido tanto para cadenas cortas como largas. (Ruby 2.0.0-p247) ¿Alguien puede confirmar esto? – Plasmarob

2

Siempre se puede usar algo como

"string".sub!(/.{X}$/,'') 

Dónde X es el número de caracteres que desea eliminar.

O con la asignación de/con el resultado:

myvar = "string"[0..-X] 

donde X es el número de caracteres más uno de eliminar.

-2
x = "my_test" 
last_char = x.split('').last 
+1

pregunta sobre eliminar los últimos N caracteres de una cadena, no sobre encontrar el último carácter – unnitallman

24

Yo sugeriría chop. Creo que ha sido mencionado en uno de los comentarios, pero sin enlaces ni explicaciones, así que he aquí por qué creo que es mejor:

Simplemente elimina el último carácter de una cadena y no tiene que especificar ningún valor para eso ocurrir.

Si necesita eliminar más de un carácter, entonces chomp es su mejor opción. Esto es lo que el ruby docs tienen que decir sobre chop:

devuelve una nueva cadena con el último carácter eliminado. Si la cadena termina con \ r \ n, se eliminan ambos caracteres. Al aplicar chop en una cadena vacía, se devuelve una cadena vacía.Cadena # Chomp es a menudo una alternativa más segura , ya que deja la cadena sin cambios si no termina en un separador registro.

Aunque esto se utiliza sobre todo para eliminar los separadores como \r\n Lo he utilizado para eliminar el último carácter de una cadena simple, por ejemplo, el s para hacer la palabra singular.

+1

¿No eliminaría ese único último carácter? La pregunta es sobre "personajes" en plural – maetthew

+0

Sí, tienes razón, pero chomp ("caracteres") eliminará los últimos "caracteres". No estaba claro si el OP quería caracteres específicos o solo N caracteres. – kakubei

+0

Gracioso, esta es la respuesta correcta – Amala

27
name = "my text" 
x.times do name.chop! end 

Aquí en la consola:

>name = "Nabucodonosor" 
=> "Nabucodonosor" 
> 7.times do name.chop! end 
=> 7 
> name 
=> "Nabuco" 
5

si está utilizando rieles, probar:

"my_string".last(2) # => "ng" 

[Editado]

Para obtener la cadena sin los 2 últimos caracteres :

n = "my_string".size 
"my_string"[0..n-3] # => "my_stri" 

Nota: el último carácter de cadena está en n-1. Entonces, para eliminar los últimos 2, usamos n-3.

+1

Esto no elimina las dos últimas letras. Los devuelve. –

+0

No es necesario que mida la cadena primero, ruby ​​usa índices negativos desde el final de la cadena de forma nativa –

1

Si estás bien con la creación de métodos de clase y desea que los caracteres que cortar, intente esto:

class String 
    def chop_multiple(amount) 
    amount.times.inject([self, '']){ |(s, r)| [s.chop, r.prepend(s[-1])] } 
    end 
end 

hello, world = "hello world".chop_multiple 5 
hello #=> 'hello ' 
world #=> 'world' 
7

Desconexión de la última n personajes es lo mismo que mantener los primeros length - n caracteres.

Soporte activa incluye String#first y String#last métodos que proporcionan una manera conveniente de mantener o dejar caer los primeros/últimos n caracteres:

require 'active_support/core_ext/string/access' 

"foobarbaz".first(3) # => "foo" 
"foobarbaz".first(-3) # => "foobar" 
"foobarbaz".last(3) # => "baz" 
"foobarbaz".last(-3) # => "barbaz" 
+0

Esta es la respuesta correcta. – alex

+1

@alex: es la respuesta correcta para Rails. –

0

El uso de expresiones regulares:

str = 'string' 
n = 2 #to remove last n characters 

str[/\A.{#{str.size-n}}/] #=> "stri" 
Cuestiones relacionadas