Yanıtlar:
Ruby 2.5'den itibaren bunu hızlı ve okunabilir bir şekilde elde etmek için delete_suffix
veya kullanabilirsiniz delete_suffix!
.
Yöntemlerle ilgili dokümanlar burada .
Son ekin ne olduğunu biliyorsanız, bu deyimseldir (ve buradaki diğer cevaplardan daha da okunabilir olduğunu iddia ediyorum):
'abc123'.delete_suffix('123') # => "abc"
'abc123'.delete_suffix!('123') # => "abc"
Üst yanıttan daha hızlıdır ( patlama yöntemiyle neredeyse % 40 ). İşte aynı karşılaştırmanın sonucu:
user system total real
chomp 0.949823 0.001025 0.950848 ( 0.951941)
range 1.874237 0.001472 1.875709 ( 1.876820)
delete_suffix 0.721699 0.000945 0.722644 ( 0.723410)
delete_suffix! 0.650042 0.000714 0.650756 ( 0.651332)
Umarım bu yararlıdır - yöntemin şu anda normal ifadeyi kabul etmediğini unutmayın, bu nedenle soneki bilmiyorsanız şimdilik geçerli değildir. Ancak, kabul edilen cevap ( güncelleme: yazma sırasında ) aynı şekilde belirttiğinden, bunun bazı insanlar için yararlı olabileceğini düşündüm.
What is the preferred way of removing the last n characters from a string?
irb> 'now is the time'[0...-4]
=> "now is the "
[0...-4]
[0..-4]
Kaldırmak istediğiniz karakterler her zaman aynı karakterlerse, chomp
şunları göz önünde bulundurun :
'abc123'.chomp('123') # => "abc"
Avantajları chomp
: sayma yok ve kod ne yaptığını daha net bir şekilde iletiyor.
chomp
Bağımsız değişken olmadan , varsa DOS veya Unix satır sonunu kaldırır:
"abc\n".chomp # => "abc"
"abc\r\n".chomp # => "abc"
Yorumlardan, #chomp
bir aralığı kullanma yerine kullanım hızı konusunda bir soru vardı . İşte ikisini karşılaştıran bir kıyaslama:
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
Deney Sonuçları (CRuby 2.13p242 kullanarak):
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)
Bu nedenle chomp, ~% 22 bir aralık kullanmaktan daha hızlıdır.
chomp!()
yerinde Dize üzerinde hareket etmek için kullanabilirsiniz .
str = str[0...-n]
Ben öneririm chop
. Ben yorumlardan birinde bahsedildi ama bağlantılar veya açıklamalar olmadan düşünüyorum bu yüzden neden daha iyi olduğunu düşünüyorum:
Bir dizeden son karakteri siler ve bunun gerçekleşmesi için herhangi bir değer belirtmeniz gerekmez.
Birden fazla karakteri kaldırmanız gerekiyorsa chomp
, en iyi bahistir. Bu nedir yakut dokümanlar hakkında söylemek zorunda chop
:
Son karakter kaldırılmış olarak yeni bir Dize döndürür. Dize \ r \ n ile biterse, her iki karakter de kaldırılır. Boş bir dizeye chop uygulamak boş bir dize döndürür. Dize # chomp genellikle daha güvenli bir alternatiftir, çünkü kayıt ayırıcıyla bitmezse dizgiyi değiştirmeden bırakır.
Her ne kadar çoğunlukla \r\n
basit bir dizeden son karakteri kaldırmak için kullandığım gibi ayırıcıları kaldırmak için kullanılır, örneğin s
kelimeyi tekil yapmak için.
Son n
karakterleri bırakmak ilk length - n
karakterleri tutmakla aynıdır .
Aktif Destek , ilk / son karakterleri saklamak veya bırakmak için uygun bir yol sağlayan yöntemler String#first
ve String#last
yöntemler içerir n
:
require 'active_support/core_ext/string/access'
"foobarbaz".first(3) # => "foo"
"foobarbaz".first(-3) # => "foobar"
"foobarbaz".last(3) # => "baz"
"foobarbaz".last(-3) # => "barbaz"
ray kullanıyorsanız, şunu deneyin:
"my_string".last(2) # => "ng"
[REDAKTE]
Son 2 karakter OLMADAN dizeyi almak için:
n = "my_string".size
"my_string"[0..n-3] # => "my_stri"
Not: Son karakter dizisi n-1'de. Yani, son 2'yi kaldırmak için n-3 kullanıyoruz.
Her zaman böyle bir şey kullanabilirsiniz
"string".sub!(/.{X}$/,'')
Kaldırılacak X
karakter sayısı nerede .
Veya sonucu atayarak / kullanarak:
myvar = "string"[0..-X]
nerede X
karakter sayısıdır artı bir kaldırın.
slice()
Yöntemi kontrol edin :
Sınıf yöntemleri oluşturma konusunda sorun yaşıyorsanız ve doğradığınız karakterleri istiyorsanız, şunu deneyin:
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'
Normal ifade kullanarak:
str = 'string'
n = 2 #to remove last n characters
str[/\A.{#{str.size-n}}/] #=> "stri"
x = "my_test"
last_char = x.split('').last
delete_suffix
Ruby 2.5'ten kullanabilirsiniz . Daha fazla bilgi burada .