【问题标题】:Ruby: Split string at character, counting from the right sideRuby:在字符处拆分字符串,从右侧开始计数
【发布时间】:2009-12-04 00:35:46
【问题描述】:

短版 -- 如何在 ruby​​ 中执行 Python rsplit()?

更长的版本——如果我想在第一个 '.' 处将字符串分成两部分(名称、后缀)字符,这很好地完成了工作:

name, suffix = name.split('.', 2)

但如果我想在 last(最右边)'.' 处拆分角色,我想不出比这更优雅的东西了:

idx = name.rindex('.')
name, suffix = name[0..idx-1], name[idx+1..-1] if idx

请注意,原始名称字符串可能根本没有点,在这种情况下,名称应保持不变,后缀应为零;它也可能有多个点,在这种情况下,只有最后一个点之后的位应该是后缀。

【问题讨论】:

    标签: ruby string split


    【解决方案1】:

    String#rpartition 就是这样做的:

    name, match, suffix = name.rpartition('.')
    

    它是在 Ruby 1.8.7 中引入的,因此如果运行早期版本,您可以使用 require 'backports/1.8.7/string/rpartition' 来实现它。

    【讨论】:

    • 谢谢! String#rpartition 也出现在 Ruby 1.8.7 中。
    • @alberge:确实,我修正了我的答案。谢谢!
    【解决方案2】:

    戴上思考帽一会儿,想出了这个正则表达式:

    "what.to.do.now".split(/\.([^.]*)$/)
    => ["what.to.do", "now"]
    

    或者用人类术语来说“在点处分割,而不是在字符串末尾跟另一个点”。也适用于无点字符串和点序列:

    "whattodonow".split(/\.([^.]*)$/)
    => ["whattodonow"]
    "what.to.do...now".split(/\.([^.]*)$/)
    => ["what.to.do..", "now"]
    

    【讨论】:

      【解决方案3】:

      这是我实际要做的:

      /(.*)\.(.*)/.match("what.to.do")[1..2]
      => ["what.to", "do"]
      

      或者更传统的,

      s = "what.to.do"
      
      s.match(/(.*)\.(.*)/)[1..2]
      => ["what.to", "do"]
      

      【讨论】:

      • 我同意,但我认为他想要一个拆分解决方案:)
      • 其他很好,但是当 s 不包含点时失败。
      【解决方案4】:

      如果 this="what.to.do" 你可以这样做:

      this.split(%r{(.+)\.})
      

      你会回来的

      ["", "what.to", "do"]
      

      【讨论】:

      • 那里的空元素有点烦人,你不能在最后粘贴[1..2]来修复它,因为“whattodo”.split(%r{(.+) \.}) 返回 ["whattodo"]。
      【解决方案5】:

      如果你想要rsplit 的文字版本,你可以这样做(这部分是个玩笑,但实际上效果很好):

      "what.to.do".reverse.split('.', 2).map(&:reverse).reverse
      => ["what.to", "do"]
      

      【讨论】:

      • 酷!但我可以这样做。split(%r{(.+)\.})[1,2] 给出 sme 结果
      【解决方案6】:

      您还可以通过在文件顶部添加 rsplit 到 String 类。

      class String
        def rsplit(pattern=nil, limit=nil)
          array = self.split(pattern)
          left = array[0...-limit].join(pattern)
          right_spits = array[-limit..]
          return [left] + right_spits
        end
      end
      

      它不像拆分那样工作。 例如

      $ pry
      [1] pry(main)> s = "test.test.test"
      => "test.test.test"
      [2] pry(main)> s.split('.', 1)
      => ["test.test.test"]
      [3] pry(main)> s.split('.', 2)
      => ["test", "test.test"]
      [4] pry(main)> s.split('.', 3)
      => ["test", "test", "test"]
      

      对比

      [6] pry(main)> s
      => "test.test.test"
      [7] pry(main)> s.rsplit('.', 1)
      => ["test.test", "test"]
      [8] pry(main)> s.rsplit('.', 2)
      => ["test", "test", "test"]
      

      但我不知道如何缩短它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 2018-11-14
        • 2020-02-08
        • 1970-01-01
        • 2021-10-30
        相关资源
        最近更新 更多