programing

루비, 문자열에서 마지막 N자를 제거하시겠습니까?

easyjava 2023. 4. 9. 22:30
반응형

루비, 문자열에서 마지막 N자를 제거하시겠습니까?

마지막을 제거하는 데 권장되는 방법은 무엇입니까?n문자열에 있는 문자?

irb> 'now is the time'[0...-4]
=> "now is the "

삭제할 문자가 항상 같은 문자일 경우 다음 사항을 고려하십시오.chomp:

'abc123'.chomp('123')    # => "abc"

장점chomp세지 않고 코드를 통해 동작을 보다 명확하게 전달할 수 있습니다.

논쟁 없이chompDOS 또는 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% 더 빠릅니다.

루비 2.5 이상

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)

이것이 유용하기를 바랍니다 - 이 메서드는 현재 정규식을 받아들이지 않기 때문에 접미사를 모르면 당분간 사용할 수 없습니다.다만, 수용된 회답(작성시의 갱신)도 같은 것을 지시하고 있기 때문에, 이 방법이 도움이 되는 사람도 있다고 생각했습니다.

str = str[0..-1-n]

와는 달리[0...-n]n=0인 경우를 처리합니다.

제안하고 싶다chop코멘트 중 하나에 기재되어 있습니다만, 링크나 설명이 없는 것이 좋다고 생각하기 때문에, 다음과 같이 하는 것이 좋다고 생각합니다.

문자열에서 마지막 문자를 삭제하기만 하면 되기 때문에 값을 지정할 필요가 없습니다.

여러 문자를 삭제할 필요가 있는 경우chomp최선의 선택이야루비 박사들은 이렇게 말하고 있어요chop:

마지막 문자가 제거된 새 문자열을 반환합니다.문자열이 \r\n으로 끝나면 두 문자가 모두 삭제됩니다.빈 문자열에 잘라내기를 적용하면 빈 문자열이 반환됩니다.String #chomp는 레코드 구분자로 끝나지 않는 문자열은 변경하지 않고 그대로 두기 때문에 대부분의 경우 더 안전한 방법입니다.

이는 주로 다음과 같은 분리기를 제거하기 위해 사용됩니다.\r\n간단한 문자열에서 마지막 문자를 제거하기 위해 사용하였습니다. 예를 들어,s그 단어를 단수화하려고.

name = "my text"
x.times do name.chop! end

콘솔:

>name = "Nabucodonosor"
 => "Nabucodonosor" 
> 7.times do name.chop! end
 => 7 
> name
 => "Nabuco" 

'Dropping' (드롭)n는 첫 글자를 과 같습니다.length - n★★★★★★ 。

액티브 서포트에는, 최초의/마지막을 보관 또는 폐기하는 편리한 방법이 포함되어 있습니다.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"

주의: 마지막 문자열 문자는 n-1입니다.마지막 2개를 제거하려면 n-3을 사용합니다.

.slice()★★★★

http://ruby-doc.org/core-2.5.0/String.html#method-i-slice

언제든지 사용할 수 있습니다.

 "string".sub!(/.{X}$/,'')

서 ★★★★★X는 삭제할 문자 수입니다.

또는 결과 할당/사용:

myvar = "string"[0..-X]

서 ''는X삭제할 문자 수에 1을 더한 값입니다.

클래스 메서드를 만들 수 있고 잘라낸 문자를 원하는 경우 다음을 시도해 보십시오.

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'

regex 사용:

str = 'string'
n = 2  #to remove last n characters

str[/\A.{#{str.size-n}}/] #=> "stri"
x = "my_test"
last_char = x.split('').last

언급URL : https://stackoverflow.com/questions/4209384/ruby-remove-last-n-characters-from-a-string

반응형