Jawaban:
Pada Ruby 2.5 Anda dapat menggunakan delete_suffix
atau delete_suffix!
untuk mencapainya dengan cara yang cepat dan mudah dibaca.
Dokumen tentang metode ada di sini .
Jika Anda tahu apa sufiks itu, ini idiom (dan saya berpendapat, bahkan lebih mudah dibaca daripada jawaban lain di sini):
'abc123'.delete_suffix('123') # => "abc"
'abc123'.delete_suffix!('123') # => "abc"
Ini bahkan jauh lebih cepat (hampir 40% dengan metode bang) daripada jawaban teratas. Inilah hasil dari tolok ukur yang sama:
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)
Saya harap ini berguna - perhatikan metode saat ini tidak menerima regex jadi jika Anda tidak tahu akhiran itu tidak layak untuk saat ini. Namun, ketika jawaban yang diterima ( pembaruan: pada saat penulisan ) menentukan hal yang sama, saya pikir ini mungkin berguna bagi beberapa orang.
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]
tidak[0..-4]
Jika karakter yang ingin Anda hapus selalu karakter yang sama, maka pertimbangkan chomp
:
'abc123'.chomp('123') # => "abc"
Keuntungannya chomp
adalah: tidak menghitung, dan kode lebih jelas mengkomunikasikan apa yang dilakukannya.
Tanpa argumen, chomp
hapus akhir baris DOS atau Unix, jika ada:
"abc\n".chomp # => "abc"
"abc\r\n".chomp # => "abc"
Dari komentar, ada pertanyaan tentang kecepatan penggunaan #chomp
versus penggunaan rentang. Berikut ini adalah perbandingan yang membandingkan keduanya:
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
Hasil Benchmark (menggunakan 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)
Jadi chomp lebih cepat daripada menggunakan rentang, ~ 22%.
chomp!()
untuk bertindak pada String di tempat.
str = str[0...-n]
Saya akan menyarankan chop
. Saya pikir itu telah disebutkan dalam salah satu komentar tetapi tanpa tautan atau penjelasan, jadi inilah mengapa saya pikir itu lebih baik:
Itu hanya menghapus karakter terakhir dari string dan Anda tidak perlu menentukan nilai apa pun untuk itu terjadi.
Jika Anda perlu menghapus lebih dari satu karakter maka chomp
itu taruhan terbaik Anda. Inilah yang dikatakan dokter rubi tentang chop
:
Mengembalikan String baru dengan karakter terakhir dihapus. Jika string diakhiri dengan \ r \ n, kedua karakter akan dihapus. Menerapkan pemotongan ke string kosong akan mengembalikan string kosong. String # chomp seringkali merupakan alternatif yang lebih aman, karena string tidak akan berubah jika tidak diakhiri dengan pemisah rekaman.
Meskipun ini sebagian besar digunakan untuk menghapus pemisah seperti \r\n
saya telah menggunakannya untuk menghapus karakter terakhir dari string sederhana, misalnya s
untuk membuat kata singular.
Menjatuhkan n
karakter terakhir sama dengan menjaga length - n
karakter pertama .
Dukungan Aktif termasuk String#first
dan String#last
metode yang memberikan cara mudah untuk menjaga atau menjatuhkan karakter pertama / terakhir n
:
require 'active_support/core_ext/string/access'
"foobarbaz".first(3) # => "foo"
"foobarbaz".first(-3) # => "foobar"
"foobarbaz".last(3) # => "baz"
"foobarbaz".last(-3) # => "barbaz"
jika Anda menggunakan rel, coba:
"my_string".last(2) # => "ng"
[Diedit]
Untuk mendapatkan string TANPA 2 karakter terakhir:
n = "my_string".size
"my_string"[0..n-3] # => "my_stri"
Catatan: char string terakhir ada di n-1. Jadi, untuk menghapus 2 terakhir, kami menggunakan n-3.
Anda selalu dapat menggunakan sesuatu seperti
"string".sub!(/.{X}$/,'')
Di mana X
jumlah karakter yang akan dihapus.
Atau dengan menugaskan / menggunakan hasilnya:
myvar = "string"[0..-X]
di mana X
jumlah karakter ditambah satu untuk dihapus.
Lihatlah slice()
metodenya:
Jika Anda tidak masalah dengan membuat metode kelas dan ingin karakter yang Anda potong, coba ini:
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'
Menggunakan regex:
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
dari Ruby 2.5. Info lebih lanjut di sini .