Jawaban:
Pada Ruby 2.5 Anda dapat menggunakan delete_suffixatau 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 chompadalah: tidak menghitung, dan kode lebih jelas mengkomunikasikan apa yang dilakukannya.
Tanpa argumen, chomphapus akhir baris DOS atau Unix, jika ada:
"abc\n".chomp # => "abc"
"abc\r\n".chomp # => "abc"
Dari komentar, ada pertanyaan tentang kecepatan penggunaan #chompversus 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 chompitu 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\nsaya telah menggunakannya untuk menghapus karakter terakhir dari string sederhana, misalnya suntuk membuat kata singular.
Menjatuhkan nkarakter terakhir sama dengan menjaga length - nkarakter pertama .
Dukungan Aktif termasuk String#firstdan String#lastmetode 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 Xjumlah karakter yang akan dihapus.
Atau dengan menugaskan / menggunakan hasilnya:
myvar = "string"[0..-X]
di mana Xjumlah 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_suffixdari Ruby 2.5. Info lebih lanjut di sini .