例如:
"Angry Birds 2.4.1".split(" ", 2)
=> ["Angry", "Birds 2.4.1"]
如何将字符串拆分为:["Angry Birds", "2.4.1"]
答案 0 :(得分:84)
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