manejo contar caracteres cadenas ruby string

cadenas - contar caracteres en ruby



Ruby, ¿eliminar los últimos N caracteres de una cadena? (12)

¿Cuál es la forma preferida de eliminar los últimos n caracteres de una cadena?



Eliminar los últimos n caracteres es lo mismo que mantener la primera length - n caracteres.

El soporte activo incluye los métodos String#first y String#last que proporcionan una manera conveniente de mantener o eliminar 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"


Si está utilizando rieles, intente:

"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: la última cadena de caracteres está en n-1. Entonces, para eliminar los últimos 2, usamos n-3.


Si estás de acuerdo con la creación de métodos de clase y quieres los caracteres que cortas, prueba 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''


Si los caracteres que desea eliminar son siempre los mismos, entonces considere chomp :

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

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

Sin argumentos, chomp elimina el final de línea de DOS o Unix, si alguno de los dos está presente:

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

De los comentarios, hubo una pregunta sobre la velocidad de uso de #chomp en lugar de usar un rango. Aquí hay un punto de referencia comparando 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)

Entonces chomp es más rápido que usar un rango, en ~ 22%.


Siempre puedes usar algo como

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

Donde X es el número de caracteres a eliminar.

O con asignar / usar el resultado:

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

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


Usando regex:

str = ''string'' n = 2 #to remove last n characters str[//A.{#{str.size-n}}/] #=> "stri"


Yo sugeriría chop . Creo que se ha mencionado en uno de los comentarios, pero sin enlaces ni explicaciones, por lo que creo que es mejor:

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

Si necesitas eliminar más de un personaje, entonces chomp es tu mejor apuesta. Esto es lo que dicen los doctores ruby sobre el chop :

Devuelve una nueva cadena con el último carácter eliminado. Si la cadena termina con / r / n, ambos caracteres se eliminan. La aplicación de cortar a una cadena vacía devuelve una cadena vacía. String # chomp es a menudo una alternativa más segura, ya que no cambia la cadena si no termina en un separador de registros.

Aunque se usa principalmente para eliminar separadores como /r/n lo he usado para eliminar el último carácter de una cadena simple, por ejemplo, la s para hacer que la palabra sea singular.


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


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"


str = str[0...-n]


x = "my_test" last_char = x.split('''').last