Я хочу разбить строку, подавляя все пустые поля
Команда:
",1,2,,3,4,,".split(',')
Результат:
["", "1", "2", "", "3", "4", ""]
Ожидаемый:
["1", "2", "3", "4"]
Как это сделать?
Редактировать
Хорошо. Просто чтобы подвести итог всем заданным хорошим вопросам.
Я хотел, чтобы метод разделения (или другой метод) не генерировал пустые строки. Похоже, это невозможно.
Итак, решение - двухэтапный процесс: разделить строку как обычно, а затем каким-то образом удалить пустые строки из результирующего массива.
Вторая часть точно этот вопрос (и его дубликат )
Поэтому я бы использовал
",1,2,,3,4,,".split(',').delete_if(&:empty?)
Решение, предложенное Никитой Рыбак и пользователем 229426, заключается в использовании метода отклонения. Согласно docs reject возвращает новый массив. Хотя метод delete_if более эффективен, поскольку мне не нужна копия. Использование select , предложенное Марком Байерсом, еще более неэффективно.
steenslag предложил заменить запятые пробелом, а затем использовать разделение пробелом:
",1,2,,3,4,,".gsub(',', ' ').split(' ')
На самом деле документация говорит, что пространство есть на самом деле пустое пространство. Но результаты «split (/ \ s /)» и «split ('')» не совпадают. Почему?
Марк Байерс предложил другое решение - просто используя регулярные выражения. Похоже, это то, что мне нужно. Но это решение подразумевает, что вы должны быть мастером регулярного выражения. Но это отличное решение! Например, если мне нужны пробелы в качестве разделителей, а также любой не буквенно-цифровой символ, я могу переписать это в
",1,2, ,3 3,4 4 4,,".scan(/\w+[\s*\w*]*/)
, результат будет:
["1", "2", "3 3", "4 4 4"]
Но опять же, регулярные выражения очень неинтуитивны, и они требуют опыта.
Резюме
Я ожидаю, что это разделение будет работать с пробелами, как если бы они были запятыми или даже регулярным выражением. Я ожидаю, что это не приведет к созданию пустых строк. Я думаю, что это ошибка в ruby или мое недоразумение.
Сделал это вопросом сообщества.