Ruby:在字符处拆分字符串,从右侧开始计算

时间:2009-12-04 00:35:47

标签: ruby string split

简短版本 - 如何在ruby中使用Python rsplit()?

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

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

但如果我想分开 last (最右边)''。性格,我还没有能够提出比这更优雅的东西:

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

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

6 个答案:

答案 0 :(得分:43)

String#rpartition就是这样做的:

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

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

答案 1 :(得分:5)

戴上思考上限一段时间,然后想出了这个正则表达式:

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

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

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

答案 2 :(得分:2)

这就是我实际做的事情:

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

或者更常规的是,

s = "what.to.do"

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

答案 3 :(得分:0)

如果这=“what.to.do”你可以这样做:

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

你会回来的

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

您还可以通过将c = ['Report_Mongo','client', 'Month_1', 'Month_2'] 添加到String类中,方法是将其添加到文件顶部。

rsplit

它不是像split那样工作。 例如

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

vs。

$ 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"]

但是我不太想知道如何将其短短分割。