Использование заголовка с Ruby 1.8.7

Как я могу использовать заглавные буквы в строке, чтобы заглавными были только обозначенные слова.

Вы должны пройти этот тест: "Барак Обама" == "Барак Обама" и "Ловец во ржи" == "Ловец во ржи"

Пока у меня есть метод, который будет использовать все слова:

#Capitalizes the first title of every word.
def capitalize(words)
     words.split(" ").map {|words| words.capitalize}.join(" ")
end

Каковы наиболее эффективные следующие шаги, которые я мог бы предпринять, чтобы прийти к решению? Спасибо!

2 ответа

Решение

Вы можете создать список слов, которые вы не хотите использовать для своей выгоды и сделать

excluded_words = %w(the and in) #etc

def capitalize_all(sentence, excluded_words)
  sentence.gsub(/\w+/) do |word|
    excluded_words.include?(word) ? word : word.capitalize
  end
end

Кстати, если вы использовали Rails и не нуждались в исключении определенных слов, вы могли бы использовать titleize,

"the catcher in the rye".titleize
#=> "The Catcher In The Rye"

Вот еще одно решение. Это не так красиво, но оно имеет дело с аббревиатурами, что вы хотите оставить все заглавные буквы и сокращения, которые вы не хотите калечить, как мое предыдущее использование сокращения не делает. Кроме того, это гарантирует, что ваше первое и последнее слово будет написано с большой буквы.

class String
  def titlecase
    lowerCaseWords = ["a", "aboard", "about", "above", "across", "after", "against", "along", "amid", "among", "an", "and", "around", "as", "at", "before", "behind", "below", "beneath", "beside", "besides", "between", "beyond", "but", "by", "concerning", "considering", "d", "despite", "down", "during", "em", "except", "excepting", "excluding", "following", "for", "from", "in", "inside", "into", "it", "ll", "m", "minus", "near", "nor", "of", "off", "on", "onto", "opposite", "or", "outside", "over", "past", "per", "plus", "re", "regarding", "round", "s", "save", "since", "t", "than", "the", "through", "to", "toward", "towards", "under", "underneath", "unlike", "until", "up", "upon", "ve", "versus", "via", "with", "within", "without", "yet"]
    titleWords = self.gsub( /\w+/ )
    titleWords.each_with_index do | titleWord, i |
      if i != 0 && i != titleWords.count - 1 && lowerCaseWords.include?( titleWord.downcase )
        titleWord
      else
        titleWord[ 0 ].upcase + titleWord[ 1, titleWord.length - 1 ]
      end
    end
  end
end

Вот несколько примеров того, как его использовать

puts 'barack obama'.titlecase # => Barack Obama
puts 'the catcher in the rye'.titlecase # => The Catcher in the Rye
puts 'NASA would like to send a person to mars'.titlecase # => NASA Would Like to Send a Person to Mars
puts 'Wayne Gretzky said, "You miss 100% of the shots you don\'t take"'.titlecase # => Wayne Gretzky Said, "You Miss 100% of the Shots You Don't Take"
Другие вопросы по тегам