回答:
Ruby 2.5以降では、delete_suffix
またはdelete_suffix!
を使用して、高速で読み取り可能な方法でこれを実現できます。
メソッドに関するドキュメントはこちらです。
あなたがサフィックスが何であるか知っているなら、これは慣用的です(そして私はここで他の答えよりもさらに読みやすいと思います):
'abc123'.delete_suffix('123') # => "abc"
'abc123'.delete_suffix!('123') # => "abc"
これは、トップの回答よりもはるかに高速です(bangメソッドでは約40%)。同じベンチマークの結果は次のとおりです。
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)
これが役立つことを願っています。現在、このメソッドは正規表現を受け入れないため、サフィックスがわからない場合、当面は有効ではありません。しかし、受け入れられた回答(更新:執筆時点)が同じことを指示しているので、これは一部の人々にとって役立つかもしれないと思いました。
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]
削除する文字が常に同じ文字である場合は、次のことを考慮してchomp
ください。
'abc123'.chomp('123') # => "abc"
の利点は次のchomp
とおりです。カウントせず、コードはそれが何をしているかをより明確に伝えます。
引数なしでchomp
、DOSまたはUnixの行末を削除します(存在する場合)。
"abc\n".chomp # => "abc"
"abc\r\n".chomp # => "abc"
コメントから、使用速度と#chomp
範囲使用の速度の問題がありました。2つを比較するベンチマークは次のとおりです。
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)
したがって、chompは範囲を使用するよりも22%高速です。
chomp!()
は文字列をその場で操作するために使用できます。
str = str[0...-n]
お勧めしchop
ます。私はそれがコメントの1つで言及されたと思いますが、リンクや説明はありませんので、これが私がより良いと思う理由です:
文字列から最後の文字を削除するだけで、そのために値を指定する必要はありません。
複数のキャラクターを削除する必要がある場合chomp
は、最善の策です。これはrubyのドキュメントについてのコメントchop
です:
最後の文字が削除された新しい文字列を返します。文字列が\ r \ nで終わる場合、両方の文字が削除されます。空の文字列にチョップを適用すると、空の文字列が返されます。String#chompは、レコード区切り文字で終わらない場合は文字列を変更しないため、多くの場合、より安全な代替手段です。
これは主に\r\n
、たとえばs
、単語を単数形にするために、単純な文字列から最後の文字を削除するために使用したような区切り記号を削除するために使用されます。
最後のn
文字を削除することは、最初のlength - n
文字を保持することと同じです。
アクティブなサポートが含ま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"
レールを使用している場合は、以下を試してください。
"my_string".last(2) # => "ng"
[編集済み]
最後の2文字なしで文字列を取得するには:
n = "my_string".size
"my_string"[0..n-3] # => "my_stri"
注:最後の文字列charはn-1にあります。したがって、最後の2つを削除するには、n-3を使用します。
あなたはいつものようなものを使うことができます
"string".sub!(/.{X}$/,'')
X
削除する文字数はどこですか。
または結果の割り当て/使用:
myvar = "string"[0..-X]
ここX
で、削除する文字数に1を加えた数です。
slice()
メソッドを確認してください:
x = "my_test"
last_char = x.split('').last
delete_suffix
Ruby 2.5から使用できます。詳細はこちら。