Например:
"Angry Birds 2.4.1".split(" ", 2)
=> ["Angry", "Birds 2.4.1"]
Как я могу разбить строку на: ["Angry Birds", "2.4.1"]
Например:
"Angry Birds 2.4.1".split(" ", 2)
=> ["Angry", "Birds 2.4.1"]
Как я могу разбить строку на: ["Angry Birds", "2.4.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"
У меня есть такое решение:
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".split(/ (?=\d+)/)
Это, вероятно, слишком сложно (и, вероятно, не особенно эффективно), но вы можете сделать это:
"Angry Birds 2.4.1".reverse.split(" ", 2).map(&:reverse).reverse
Решение rpartition делает отличный сексуальный однострочный (я голосовал за него), но здесь другой метод, если вам нужен более гибкий однострочник для решения более сложных проблем разбиения:
["Angry Birds 2.4.1".split(' ')[0..-2].join(' '), "Angry Birds 2.4.1".split(' ')[-1..-1].join(' ')]
Под более гибким подходом я имею в виду, что если бы было больше разделов, вы можете просто настроить диапазон последовательности.
Мне кажется, что я не могу правильно привести код кода в свой комментарий, поэтому я представляю его как отдельный ответ, хотя Вадим Тимиров заслуживает весь кредит за решение 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
... меньше!: -)
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"]