Ruby: удалить символы пробела в начале строки.

У меня есть массив слов, где я пытаюсь удалить любые пробелы, которые могут существовать в начале слова, а не в конце. rstrip! просто заботится о конце строки.

example_array = ['peanut', ' butter', 'sammiches']
desired_output = ['peanut', 'butter', 'sammiches']

Как вы можете видеть, не все элементы массива имеют проблему с пробелами, поэтому я не могу просто удалить первый символ, как если бы все элементы начинались с одного пробела char.

Полный код:

words = params[:word].gsub("\n", ",").delete("\r").split(",")
words.delete_if {|x| x == ""}
words.each do |e|
  e.lstrip!
end

Пример текста, который пользователь может ввести в форму:

Corn on the cob,
Fibonacci,
StackOverflow
Chat, Meta, About
Badges
Tags,,
Unanswered
Ask Question

Ответы

Ответ 1

String#lstrip (или String#lstrip!) что вы после.

desired_output = example_array.map(&:lstrip)

Больше комментариев о вашем коде:

  • delete_if {|x| x == ""} можно заменить на delete_if(&:empty?)
  • Если вы хотите reject!, потому что delete_if будет возвращать только другой массив, а не изменять существующий.
  • words.each {|e| e.lstrip!} можно заменить на words.each(&:lstrip!)
  • delete("\r") должен быть избыточным, если вы читаете текстовый документ в стиле Windows на машине Windows или документ в стиле Unix на машине Unix.
  • split(",") можно заменить на split(", ") или split(/, */) (или /, ?/, если должно быть не более одного пространства)

Итак, теперь это выглядит так:

words = params[:word].gsub("\n", ",").split(/, ?/)
words.reject!(&:empty?)
words.each(&:lstrip!)

Я бы мог дать больше советов, если бы у вас был образец текста.

Изменить: Хорошо, здесь идет:

temp_array = text.split("\n").map do |line|
  fields = line.split(/, */)
  non_empty_fields = fields.reject(&:empty?)
end
temp_array.flatten(1)

Используемые методы: String#split, Enumerable#map, Enumerable#reject и Array#flatten.

В Ruby также есть библиотеки для разбора разделенных запятыми файлов, но я думаю, что они немного отличаются между 1,8 и 1,9.

Ответ 2

> ' string '.lstrip.chop
=> "string"

Сбрасывает оба пробела...