Как разделить строку Ruby по "\ r \ n"? - PullRequest
5 голосов
/ 12 мая 2011

Задана строка типа:

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

    Я пытался s.split(/(\r\n)+/), но это не дает мне ожидаемого результата.

    Почему? Как я могу получить ожидаемый результат?

  • Получить число \r\n в массиве, то есть ожидаемый результат: [1, 3, 2]

    Как бы вы это сделали?

Я использую Ruby 1.9.2.

Ответы [ 5 ]

9 голосов
/ 12 мая 2011

Почти, попробуйте это:

s.split /[\r\n]+/
s.scan(/[\r\n]+/).map { |e| e.size/2 }

Это дает [1,3,2,1], что, возможно, является "реальным" ответом.Но в противном случае s.chomp.scan... даст [1,3,2].

8 голосов
/ 12 мая 2011

Вот как я бы это сделал:

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"]
3 голосов
/ 12 мая 2011

Вы хотите разделить на /[\r\n]+/

"G o o d\r\nDay\r\n\r\n\r\nStack\r\n\r\nOverflow\r\n".split(/[\r\n]+/)
2 голосов
/ 12 мая 2011

Вы не должны получать \r\n в своих строках, если только вы не читаете текстовый файл Windows в двоичном режиме. Прочтите его в текстовом режиме, и Ruby автоматически исправит для вас \r.

2 голосов
/ 12 мая 2011

Ваш split(/(\r\n)+/) не работает так, как вы ожидаете, потому что группы захвата включены в возвращаемый массив:

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

Простым решением было бы разделить на \r\n и выбросить пустые поля:

s.split(/\r\n/).reject { |s| s == '' }
...