2010-11-17 10 views

ответ

222

Если символы, которые вы хотите удалить, всегда одни и те же символы, а затем рассмотреть chomp:

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

Преимущества chomp являются: отсутствие счета и код более четко сообщается, что он делает.

без аргументов, chomp удаляет DOS или Unix конца строки, если либо присутствует:

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

Из комментариев, был вопрос о скорости использования #chomp по сравнению с использованием ассортимент. Вот тест сравнения два:

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 

Результаты тестов (с использованием 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) 

Так грызть быстрее, чем при использовании диапазона, на ~ 22%.

+5

Чоп также является опцией. Это менее суетливо о том, что удаляется. –

+0

алгоритмически, не будет ли что-то вроде [0 ..- #] быть быстрее? chomp должен разбирать строку, которая ищет совпадения. Исключить и завершить номер символа нет. – Plasmarob

+0

@Plasmarob, Это было бы хорошо проверить. –

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

Обратите внимание, что это работает только в Ruby 1.9. В Ruby 1.8 это удалит последние * байты *, а не последние * символы *. –

+5

Это лучше, чем выбранный ответ, поскольку 3 точки (...) легче запомнить, поскольку -n означает вывести n символов из конца строки. – lulalala

+0

также «abcd» [0 ..- 2] # => «abc» while «abcd» [0 ...- 2] # => «ab». По моему мнению, вариант с 3-мя точками приводит к более понятному коду. – mokagio

2

Заканчивать методом "среза":

http://www.ruby-doc.org/core/classes/String.html#M000843

+1

Обратите внимание, что это работает только в Ruby 1.9. В Ruby 1.8 это удалит последние * байты *, а не последние * символы *. –

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

Обратите внимание, что это работает только в Ruby 1.9. В Ruby 1.8 это удалит последние * байты *, а не последние * символы *. –

+2

Но он, вероятно, имел в виду * «байты» *, если он использует 1.8.x. – DigitalRoss

+3

Это действительно работает, но я нахожу 'abc123'.chomp (' 123 ') в два раза быстрее для коротких и очень длинных строк. (Ruby 2.0.0-p247) Может ли кто-нибудь подтвердить это? – Plasmarob

2

Вы всегда можете использовать что-то вроде

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

Где X является количество символов, чтобы удалить.

Или с назначением/с использованием результата:

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

где X является количество символов плюс один для удаления.

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

вопрос был о удалении последних N символов из строки, а не об обнаружении последнего символа – unnitallman

24

Я предлагаю chop. Я думаю, что это упоминалось в одном из комментариев, но без ссылок или объяснений, поэтому вот почему я думаю, что это лучше:

Он просто удаляет последний символ из строки, и вам не нужно указывать какие-либо значения для этого бывает.

Если вам нужно удалить более одного символа, то chomp - ваш лучший выбор. Это то, что ruby docs должно сказать о chop:

Возвращает новую строку с последним символом удален. Если строка заканчивается на \ r \ n, оба символа удаляются. Применение прерывания к пустой строке возвращает пустую строку.Строка # chomp часто является более безопасной альтернативой , так как она оставляет строку неизменной, если она не заканчивается разделителем записей .

Хотя это в основном используется для удаления сепараторов, таких как \r\n я использовал его, чтобы удалить последний символ из простой строки, например s сделать слово единственным числом.

+1

Разве это не просто удалить этот единственный символ? Вопрос о «персонажах» во множественном числе – maetthew

+0

Да, вы правы, но chomp («chars») удалит последние «символы». Мне было непонятно, нужны ли OP специальные символы или только N символов. – kakubei

+0

Забавный, это правильный ответ – Amala

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

Здесь в консоли:

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

если вы используете рельсы, попробуйте:

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

[Изменено]

Чтобы получить строку без последних 2-х символов :

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

Примечание: последний символ строки находится в n-1. Итак, чтобы удалить последние 2, мы используем n-3.

+1

Это не удаляет последние две буквы. Он возвращает их. –

+0

Вам не нужно сначала измерять строку, ruby ​​использует отрицательные индексы с конца строки изначально –

1

Если вы нормально с созданием методов класса и хотите символы отрубить, попробуйте следующее:

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

капают последние n символы так же, как сохранение первых length - n символов.

Active Support включает String#first и String#last методы, которые обеспечивают удобный способ сохранить или падение первые/последние n символы:

require 'active_support/core_ext/string/access' 

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

Это правильный ответ. – alex

+1

@alex: Это правильный ответ для Rails. –

0

Использование регулярных выражений:

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

str[/\A.{#{str.size-n}}/] #=> "stri" 
Смежные вопросы