Задана строка типа:
s = "G o o d\r\nDay\r\n\r\n\r\nStack\r\n\r\nOverflow\r\n"
Я бы хотел:
Разделить его на (\r\n)+, т.е. я бы хотел получить: ["G o o d", "Day", "Stack", "Overflow"]
(\r\n)+
["G o o d", "Day", "Stack", "Overflow"]
Я пытался s.split(/(\r\n)+/), но это не дает мне ожидаемого результата.
s.split(/(\r\n)+/)
Почему? Как я могу получить ожидаемый результат?
Получить число \r\n в массиве, то есть ожидаемый результат: [1, 3, 2]
\r\n
Как бы вы это сделали?
Я использую Ruby 1.9.2.
Почти, попробуйте это:
s.split /[\r\n]+/ s.scan(/[\r\n]+/).map { |e| e.size/2 }
Это дает [1,3,2,1], что, возможно, является "реальным" ответом.Но в противном случае s.chomp.scan... даст [1,3,2].
[1,3,2,1]
s.chomp.scan...
[1,3,2]
Вот как я бы это сделал:
s = "G o o d\r\nDay\r\n\r\n\r\nStack\r\n\r\nOverflow\r\n" s.split(/[\r\n]+/) # => ["G o o d", "Day", "Stack", "Overflow"]
Вы хотите разделить на /[\r\n]+/
/[\r\n]+/
"G o o d\r\nDay\r\n\r\n\r\nStack\r\n\r\nOverflow\r\n".split(/[\r\n]+/)
Вы не должны получать \r\n в своих строках, если только вы не читаете текстовый файл Windows в двоичном режиме. Прочтите его в текстовом режиме, и Ruby автоматически исправит для вас \r.
\r
Ваш split(/(\r\n)+/) не работает так, как вы ожидаете, потому что группы захвата включены в возвращаемый массив:
split(/(\r\n)+/)
Если шаблон содержит группы, будут возвращены соответствующие совпадениятакже в массиве.
Простым решением было бы разделить на \r\n и выбросить пустые поля:
s.split(/\r\n/).reject { |s| s == '' }