【问题标题】:Extracting the last n characters from a ruby string从 ruby​​ 字符串中提取最后 n 个字符
【发布时间】:2010-02-01 05:05:29
【问题描述】:

要从字符串中获取最后一个 n 字符,我假设您可以使用

ending = string[-n..-1]

但如果字符串的长度小于n 字母,则会得到nil

有哪些解决方法?

背景:字符串是纯 ASCII,我可以访问 ruby​​ 1.9.1,并且我使用的是普通旧 Ruby 对象(无 Web 框架)。

【问题讨论】:

    标签: ruby string


    【解决方案1】:

    嗯,我能想到的最简单的解决方法是:

    ending = str[-n..-1] || str
    

    (编辑:or 运算符的优先级低于赋值,因此请务必改用 ||。)

    【讨论】:

    • +1... 我认为这种方式比string.reverse[0..n].reverse 更容易阅读,这让我有点“等等,他为什么要这样做?” (或者如果我没有在这个问题的上下文中阅读它)
    • 很好的答案,但应该是|| 而不是or,或者在str[-n..-1] or str 周围加上括号。
    • 很好的答案,但我不喜欢 ruby​​ 不将 s[-inf..-1] 视为 x[0..inf]
    • 感谢 Andrew 指出运算符优先级问题。每次都能吸引我。
    • @perimosocordiae 你不是唯一一个。 stackoverflow.com/questions/372652/…
    【解决方案2】:

    这里你有一个单行,你可以放一个大于字符串大小的数字:

    "123".split(//).last(5).to_s
    

    对于 ruby​​ 1.9+

    "123".split(//).last(5).join("").to_s
    

    对于 ruby​​ 2.0+,join 返回一个字符串

    "123".split(//).last(5).join
    

    【讨论】:

    • 如果您使用的是最新版本的 Ruby,您可以使用 chars 而不是 split。
    • 我用了“12345678910”.split(//).last(7).join.to_s
    • @Hard-BoiledWonderland join 有效。如果您使用 join,我认为您不需要最后一个 to_s
    • @AndrewGrimm 你是对的,在这种情况下,我使用上面的 Nokogiri n.xpath('ReferenceID').inner_text.split(//).last(7).join.to_s.to_i 我需要 to_s 来执行 to_i 来提取数值。
    • 你缺少 .join - 现在它返回一个字符串数组。相反,它应该是 "123".split(//).last(5).join (Ruby 2.0.0)
    【解决方案3】:

    在纯 Ruby(没有 Rails)中,你可以这样做

    string.chars.last(n).join
    

    例如:

    2.4.1 :009 > a = 'abcdefghij'
     => "abcdefghij"
    2.4.1 :010 > a.chars.last(5).join
     => "fghij"
    2.4.1 :011 > a.chars.last(100).join
     => "abcdefghij"
    

    如果您使用的是 Ruby on Rails,您可以在字符串对象上调用方法 firstlast。首选这些方法,因为它们简洁直观。

    例如:

    [1] pry(main)> a = 'abcdefg'                                                                                                                
     => "abcdefg"
    [2] pry(main)> a.first(3)                                                                                                                   
     => "abc"
    [3] pry(main)> a.last(4)                                                                                                                    
     => "defg"
    

    【讨论】:

    • Ruby 并不暗示 Rails。
    【解决方案4】:
    ending = string.reverse[0...n].reverse
    

    【讨论】:

    • 这是我在此页面上看到的满足能够提供超过总字符串长度的结束字符长度要求的最佳方法。
    • 例如,如果您打算使用“abcde”、“ab”和“a”等一组字符串的最后 3 个字符。这种技术将导致“cde”、“ab”和“a”对每个使用相同的代码。 "abcde".reverse[0,3].reverse >>> "cde" "ab".reverse[0,3].reverse >>> "ab" "a".reverse[0,3].reverse >>> "a"
    【解决方案5】:

    您可以使用以下代码:

    string[string.length-n,string.length]
    

    【讨论】:

    • 仅代码 - 答案并不总是有帮助。解释为什么/如何修复这段代码会很棒
    【解决方案6】:

    要从字符串中获取最后 n 个字符,您可以这样做

    a[-n, n] 如果 a 是数组。

    如果你想要的话,这里有一个例子。

    ruby-1.9.2-p180 :006 > a = "911234567890"

    => "911234567890"

    ruby-1.9.2-p180 :009 > a[-5,5]

    =>“67890”

    ruby-1.9.2-p180 :010 > a[-7,7]

    => "4567890"

    【讨论】:

    • 如果数字太大,则返回nil,这是本题特意要避免的。
    • 好答案。干净。
    • 为什么会得到支持?它与 OP 询问如何解决的问题完全相同。
    【解决方案7】:

    你试过正则表达式吗?

    string.match(/(.{0,#{n}}$)/)
    ending=$1
    

    正则表达式在字符串末尾捕获尽可能多的字符,但不超过 n。并将其存储在 1 美元中。

    【讨论】:

      【解决方案8】:

      对 EmFi 的回答进行改进。

      string[/.{,#{n}}\z/m]
      

      【讨论】:

        【解决方案9】:

        我只是简单地使用这个:

        str.last(n)
        

        【讨论】:

          猜你喜欢
          • 2011-05-11
          • 2011-12-19
          • 2017-12-28
          • 1970-01-01
          • 2013-03-31
          • 2011-08-22
          • 1970-01-01
          • 2016-05-06
          相关资源
          最近更新 更多