代码之家  ›  专栏  ›  技术社区  ›  JP Silvashy Gautam Rege

Ruby,删除字符串的最后N个字符?

  •  234
  • JP Silvashy Gautam Rege  · 技术社区  · 14 年前

    删除最后一个 n 字符串中的字符?

    12 回复  |  直到 10 年前
        1
  •  17
  •   SRack    5 年前

    红宝石2.5+

    从Ruby 2.5开始,您可以使用 delete_suffix delete_suffix! 以快速易读的方式实现这一点。

    这些方法的文档是 here .

    如果你知道后缀是什么,这是惯用的(我认为,比这里的其他答案更易读):

    '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)
    

    我希望这是有用的-注意,该方法目前不接受正则表达式,所以如果你不知道后缀暂时不可行。然而,作为公认的答案( 更新:编写时 )同样的,我认为这可能对某些人有用。

        2
  •  311
  •   Abram    5 年前
    irb> 'now is the time'[0...-4]
    => "now is the "
    
        3
  •  266
  •   Michael Herold    10 年前

    如果要删除的字符始终是相同的字符,请考虑 chomp :

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

    的优点 是:不计数,代码更清楚地传达它在做什么。

    没有争论, 删除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%。

        4
  •  55
  •   Nakilon earlonrails    14 年前
    str = str[0...-n]
    
        5
  •  30
  •   kakubei    12 年前

    我建议 chop . 我认为它已经在一个评论中提到,但没有链接或解释,所以我认为它更好的原因如下:

    它只是从字符串中删除最后一个字符,而不必指定任何值。

    如果需要删除多个字符,则 chomp 是你最好的选择。这就是 ruby docs 不得不说 :

    返回删除最后一个字符的新字符串。如果字符串 以\r\n结尾,两个字符都被删除。把印章印在空的 字符串返回空字符串。弦状软骨通常更安全 替代方法,因为如果字符串不以 记录分隔符。

    尽管这主要用于移除分离器,如 \r\n 我用它来删除一个简单字符串的最后一个字符,例如 s 使这个词变得单数。

        6
  •  29
  •   joscas    12 年前
    name = "my text"
    x.times do name.chop! end
    

    在控制台中:

    >name = "Nabucodonosor"
     => "Nabucodonosor" 
    > 7.times do name.chop! end
     => 7 
    > name
     => "Nabuco" 
    
        7
  •  16
  •   chocolateboy Chris Marie    8 年前

    删除最后一个 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"
    
        8
  •  7
  •   Guihen    9 年前

    如果使用rails,请尝试:

    "my_string".last(2) # => "ng"
    

    [编辑]

    要获取没有最后两个字符的字符串:

    n = "my_string".size
    "my_string"[0..n-3] # => "my_stri"
    

    注意:最后一个字符串字符在n-1。所以,要去掉最后2个,我们用n-3。

        9
  •  3
  •   Nakilon earlonrails    13 年前

    你总是可以用

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

    在哪里? X 要删除的字符数。

    或分配/使用结果:

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

    哪里 是字符数 加一 移除。

        10
  •  3
  •   MOPO3OB    7 年前
        11
  •  1
  •   Ben Aubin    8 年前

    如果您可以创建类方法并希望切掉字符,请尝试以下操作:

    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'
    
        12
  •  0
  •   Sagar Pandya    7 年前

    使用正则表达式:

    str = 'string'
    n = 2  #to remove last n characters
    
    str[/\A.{#{str.size-n}}/] #=> "stri"
    
        13
  •  -3
  •   nickb    12 年前
    x = "my_test"
    last_char = x.split('').last