Как разделить строку Ruby на » r n»?

#ruby #string #split

#ruby #строка #разделить

Вопрос:

Учитывая строку, подобную:

 s = "G o o drnDayrnrnrnStackrnrnOverflowrn"
  

Я хотел бы:

  • Разделите ее на (rn) , т. е. я хотел бы получить: ["G o o d", "Day", "Stack", "Overflow"]

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

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

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

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

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

Ответ №1:

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

 s.split /[rn] /
s.scan(/[rn] /).map { |e| e.size/2 }
  

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

Комментарии:

1. Это также разбивается на одиночные r , n , nnrn и т.д. Это не совсем то, о чем спрашивали, но, вероятно, идея получше.

Ответ №2:

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

 s = "G o o drnDayrnrnrnStackrnrnOverflowrn"

s.split(/[rn] /) # => ["G o o d", "Day", "Stack", "Overflow"]
  

Ответ №3:

Вы хотите разделить на /[rn] /

 "G o o drnDayrnrnrnStackrnrnOverflowrn".split(/[rn] /)
  

Ответ №4:

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

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

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

 s.split(/rn/).reject { |s| s == '' }
  

Ответ №5:

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