답변:
Ruby 2.5부터는 빠르고 읽기 쉬운 방식으로이를 사용 delete_suffix
하거나 delete_suffix!
달성 할 수 있습니다 .
방법에 대한 문서는 여기에 있습니다 .
접미사가 무엇인지 아는 경우, 이것은 관용적입니다 (그리고 다른 답변보다 훨씬 읽기 쉽습니다).
'abc123'.delete_suffix('123') # => "abc"
'abc123'.delete_suffix!('123') # => "abc"
최고 답변보다 훨씬 빠릅니다 ( 뱅 방법 의 경우 거의 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
와 범위 사용에 대한 질문이있었습니다 . 다음은 두 가지를 비교 한 벤치 마크입니다.
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
. 나는 그것이 주석 중 하나에서 언급되었지만 링크 나 설명이없는 것으로 생각하므로 여기에 더 나은 이유가 있습니다.
단순히 문자열에서 마지막 문자를 제거하기 때문에 해당 값을 지정하지 않아도됩니다.
하나 이상의 캐릭터를 제거해야한다면 chomp
가장 좋은 방법입니다. 이것이 루비 문서 들이 말하는 것입니다 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"
[편집 됨]
마지막 두 문자없이 문자열을 얻으려면 :
n = "my_string".size
"my_string"[0..n-3] # => "my_stri"
참고 : 마지막 문자열 문자는 n-1입니다. 따라서 마지막 2를 제거하기 위해 n-3을 사용합니다.
delete_suffix
Ruby 2.5에서 사용할 수 있습니다 . 자세한 내용은 여기를 참조하십시오 .