Например:
"Angry Birds 2.4.1".split(" ", 2)
=> ["Angry", "Birds 2.4.1"]
Как я могу разделить строку на: ["Angry Birds", "2.4.1"]
.
Строка#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"]
Поскольку возвращаемое значение является массивом, используя .первая и .последние позволит лечить результат, как если бы он был разделен на две части, электронный.г
irb(main):073:0> str.rpartition(' ').first
=> "Angry Birds"
irb(main):074:0> str.rpartition(' ').last
=> "2.4.1"
У меня есть подобное решение:
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"]
Может быть, что-то вроде этого? Сплит, где за пробелом следует что угодно, кроме пробела, до конца строки.
"Angry Birds 2.4.1".split(/ (?=\S+$)/)
#=> ["Angry Birds", "2.4.1"]
Это, наверное, слишком сложно (и, наверное, не особенно эффективные), но вы можете сделать это:
"Angry Birds 2.4.1".reverse.split(" ", 2).map(&:reverse).reverse
В rpartition решение делает большой сексуальный один-лайнер (я за нее голосовал), но здесь'с другой методики, если вы хотите один лайнер, что's более гибкой для решения более сложных разделов проблемы:
["Angry Birds 2.4.1".split(' ')[0..-2].join(' '), "Angry Birds 2.4.1".split(' ')[-1..-1].join(' ')]
Более гибкий, я имею в виду, если бы было больше пунктов секционирования, можно просто регулировать диапазон последовательности.
Я не'т, кажется, в состоянии получить пример кода в мой комментарий правильно отформатировать, поэтому я'м представив его в качестве отдельного ответа, хотя Вадим Tyemirov заслуживает всех кредит на строку#rpartition решение он предоставил выше.
Я просто хотела добавить, что строка#rpartition играет очень красиво с Ruby'ы "и Дон'т волнует, что" variable, как обычно вы'вновь действительно интересует только первый и последний элемент в результирующий массив, а не элемент (сепаратор):
в
[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"
Так что не надо за массив#первый
или `массив#последние... меньше-это больше! :-)
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"]