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

时间:2012-08-30 07:56:10

标签: ruby

例如:

"Angry Birds 2.4.1".split(" ", 2)
 => ["Angry", "Birds 2.4.1"] 

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

10 个答案:

答案 0 :(得分:84)

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

由于返回的值是一个数组,因此使用 .first .last 可以将结果视为分成两部分,例如

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

答案 1 :(得分: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"]

答案 2 :(得分:7)

有些人喜欢这样吗? 拆分空格后面除了字符串末尾之外的任何空格。

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

答案 3 :(得分:2)

"Angry Birds 2.4.1".split(/ (?=\d+)/)

答案 4 :(得分:2)

这可能太棘手了(可能效率不高),但你可以这样做:

"Angry Birds 2.4.1".reverse.split(" ", 2).map(&:reverse).reverse

答案 5 :(得分:1)

rpartition解决方案是一个非常性感的单线程(我投票支持它),但如果你想要一个更灵活的解决更复杂的分区问题的单线程,这是另一种技术:

["Angry Birds 2.4.1".split(' ')[0..-2].join(' '), "Angry Birds 2.4.1".split(' ')[-1..-1].join(' ')]

通过更灵活,我的意思是如果有更多的项目被分区,你可以调整序列的范围。

答案 6 :(得分:1)

我似乎无法将我的评论中的示例代码正确格式化,因此我将其作为单独的答案提交,即使Vadym Tyemirov值得http://prntscr.com/6z23nw的所有功劳。 1}}他在上面提供的解决方案。

我只是想补充说String#rpartition非常适合Ruby' "不关心"变量,通常你确实只对结果数组的第一个和最后一个元素感兴趣,但不感兴趣的是中间元素(分隔符)

String#rpartition

所以不需要[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" Array#first ......少即是多! : - )

答案 7 :(得分:0)

class String
  def divide_into_two_from_end(separator = ' ')
    self.split(separator)[-1].split().unshift(self.split(separator)[0..-2].join(separator))
  end
end

"Angry Birds 2.4.1".divide_into_two_from_end(' ') #=> ["Angry Birds", "2.4.1"]

答案 8 :(得分:0)

创建一个String#split_on_last方法。

重度是受halfelf's answer的启发,但允许的不只是单个字符,没有默认的param值,并且为了清楚起见而进行了重构。

定义

Class String
  def split_on_last( text )
    position_of_last_occurrence = self.rindex( text )

    return self if position_of_last_occurrence.nil?

    first_part = self[ 0...position_of_last_occurrence ]
    last_part  = self[ position_of_last_occurrence + text.length..-1 ]

    [ first_part, last_part ]
  end
end

用法

"Angry Birds 2.4.1".split_on_last( " " )
#=> ["Angry Birds", "2.4.1"]

"start middle end end suffix".split_on_last( "end" )
=> ["start middle end ", " suffix"]

答案 9 :(得分:0)

反转,拆分,然后反转数组中的每个元素

"Angry Birds 2.4.1".reverse.split(' ', 2).map(&:reverse).reverse