#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 для вас.