Подтвердить что ты не робот

Как разбить строку на две части, по последнему вступлению в раскол char?

Например:

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

Как я могу разбить строку на: ["Angry Birds", "2.4.1"]

4b9b3361

Ответ 1

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"

Ответ 2

У меня есть такое решение:

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

Ответ 3

Может быть как то так? Разделить, где за пробелом следует что угодно, кроме пробела до конца строки.

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

Ответ 4

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

Ответ 5

Это, вероятно, слишком сложно (и, вероятно, не особенно эффективно), но вы можете сделать это:

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

Ответ 6

Решение rpartition делает отличный сексуальный однострочный (я голосовал за него), но здесь другой метод, если вам нужен более гибкий однострочник для решения более сложных проблем разбиения:

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

Под более гибким подходом я имею в виду, что если бы было больше разделов, вы можете просто настроить диапазон последовательности.

Ответ 7

Мне кажется, что я не могу правильно привести код кода в свой комментарий, поэтому я представляю его как отдельный ответ, хотя Вадим Тимиров заслуживает весь кредит за решение String#rpartition, которое он предоставил выше.

Я просто хотел добавить, что String#rpartition играет очень хорошо с переменной Ruby "не волнует", поскольку обычно вас интересует только первый и последний элемент массива результатов, но не средний элемент ( разделитель):

[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 или Array#last... меньше!: -)

Ответ 8

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