如何通过最后一次出现的split char将字符串拆分为两部分?

ohh*_*hho 45 ruby

例如:

"Angry Birds 2.4.1".split(" ", 2)
 => ["Angry", "Birds 2.4.1"] 
Run Code Online (Sandbox Code Playgroud)

如何将字符串拆分为: ["Angry Birds", "2.4.1"]

Vad*_*rov 90

String#rpartition,例如

irb(main):068:0> str = "Angry Birds 2.4.1"
=> "Angry Birds 2.4.1"
irb(main):069:0> str.rpartition(' ')
=> ["Angry Birds", " ", "2.4.1"]
Run Code Online (Sandbox Code Playgroud)

由于返回值是一个数组,使用.首先.去年将允许治疗结果,如果它是一分为二,例如

irb(main):073:0> str.rpartition(' ').first
=> "Angry Birds"
irb(main):074:0> str.rpartition(' ').last
=> "2.4.1"
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`String#rpartition`与Ruby的_"不关心"变量非常吻合:[1] pry(main)> name,_,version ="Angry Birds 2.4.1".rpartition('')=> ["愤怒的小鸟","","2.4.1"] [2]撬(主)>名字=>"愤怒的小鸟"[3]撬(主)>版=>"2.4.1"所以不需要`Array#first`或`Array#last` ... less is more!:-) (5认同)

hal*_*elf 9

我有这样的解决方案:

class String
  def split_by_last(char=" ")
    pos = self.rindex(char)
    pos != nil ? [self[0...pos], self[pos+1..-1]] : [self]
  end
end

"Angry Birds 2.4.1".split_by_last  #=> ["Angry Birds", "2.4.1"]
"test".split_by_last               #=> ["test"]
Run Code Online (Sandbox Code Playgroud)


old*_*god 8

有人喜欢这样吗?拆分空格后面除了一个空格,直到字符串末尾.

"Angry Birds 2.4.1".split(/ (?=\S+$)/)
#=> ["Angry Birds", "2.4.1"]
Run Code Online (Sandbox Code Playgroud)


pva*_*erk 5

我似乎无法在我的评论中正确格式化示例代码,因此我将其作为单独的答案提交,尽管Vadym Tyemirov值得称赞String#rpartition他在上面提供的解决方案。

我只是想补充一点,它String#rpartition与 Ruby 的“don't care”变量非常相配,因为通常您确实只对结果数组的第一个和最后一个元素感兴趣,而不对中间元素(分隔符)感兴趣:

[1] pry(main)> name, _, version = "Angry Birds 2.4.1".rpartition(' ')
=> ["Angry Birds", " ", "2.4.1"]
[2] pry(main)> name
=> "Angry Birds"
[3] pry(main)> version
=> "2.4.1"
Run Code Online (Sandbox Code Playgroud)

所以不需要Array#firstArray#last...少即是多!:-)