Как я могу написать функцию Ruby, которая разбивает входные данные любым видом пробела и удаляет все пробелы из результата? Например, если вход
aa bbb
cc dd ee
Затем верните массив ["aa", "bbb", "cc", "dd", "ee"]
.
Как я могу написать функцию Ruby, которая разбивает входные данные любым видом пробела и удаляет все пробелы из результата? Например, если вход
aa bbb
cc dd ee
Затем верните массив ["aa", "bbb", "cc", "dd", "ee"]
.
Для примера, который вы дали:
str.gsub(/\s+/m, ' ').strip.split(" ")
он возвращает:
["aa", "bbb", "cc", "dd", "ee"]
Значение кода:
/\s+/m
- более сложная часть. \s
означает пробел, поэтому \s+
означает одну или несколько пробелов. В части /m
, m
называется модификатором, в этом случае это означает, что многострочный, то есть посещение многих строк, а не только одного, которое является поведением по умолчанию.
Таким образом, /\s+/m
означает поиск последовательностей одного или нескольких пробелов.
gsub
означает замену всех.
strip
является эквивалентом trim
на других языках и удаляет пробелы из фронта и конца строки.
Как, я писал объяснение, это может быть так, когда вы заканчиваете и заканчиваете символ конца или начала строки.
Чтобы быть в безопасности
Код может быть записан как:
str.gsub(/\s+/m, ' ').gsub(/^\s+|\s+$/m, '').split(" ")
Итак, если у вас есть:
str = "\n aa bbb\n cc dd ee\n\n"
Затем вы получите:
["aa", "bbb", "cc", "dd", "ee"]
Значение нового кода:
^\s+
последовательность белых пробелов в начале строки
\s+$
последовательность белых пробелов в конце строки
So gsub(/^\s+|\s+$/m, '')
означает удаление любой последовательности белого пробела в начале строки и в конце строки.
Это поведение по умолчанию String#split
:
input = <<-TEXT
aa bbb
cc dd ee
TEXT
input.split
Результат:
["aa", "bbb", "cc", "dd", "ee"]
Это работает во всех версиях Ruby, которые я тестировал, включая 1.8.7, 1.9.3, 2.0.0 и 2.1.2.
input = <<X
aa bbb
cc dd ee
X
input.strip.split(/\s+/)
Как небольшая модификация ответа Vidaica, в Ruby 2.1.1 он выглядит как
input.split(" ")
Будет компенсировать все пробелы, будь то пробелы, табуляции или символы новой строки, что дает:
["aa", "bbb", "cc", "dd", "ee"]
input.split("\s")
Если вместо /\s/
используется "\s"
, белые будут удалены из результата.