Как я могу написать функцию 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", белые будут удалены из результата.