我有一根长绳子,“背上的银色骑手和棕榈树”。我想写一个Ruby方法,将句子中间除“on”,“the”和“and”之外的所有单词都大写,但是在开头时将“the”大写?
这是我到目前为止所做的:
def title(word)
small_words = %w[on the and]
word.split(' ').map do |w|
unless small_words.include?(w)
w.capitalize
else
w
end
end.join(' ')
end
这段代码实际上完成了我需要的大部分内容,但不知道如何在句子开头包含或排除“the”。
答案 0 :(得分:3)
这将使所有单词大写,除了句子中不是第一个的单词(你的小单词)。
def title(sentence)
stop_words = %w{a an and the or for of nor} #there is no such thing as a definite list of stop words, so you may edit it according to your needs.
sentence.split.each_with_index.map{|word, index| stop_words.include?(word) && index > 0 ? word : word.capitalize }.join(" ")
end
答案 1 :(得分:2)
最简单的方法是先忘掉第一个字母的特殊情况,然后在完成其他所有操作后再处理它:
def title(sentence)
small_words = %w[on the and]
capitalized_words = sentence.split(' ').map do |word|
small_words.include?(word) ? word : word.capitalize
end
capitalized_words.first.capitalize!
capitalized_words.join(' ')
end
这也会在开头时将任何“小词”大写,而不只是“the” - 但我认为这可能是你想要的。
答案 2 :(得分:0)
现有代码的简单模式可以使其正常工作:
def title( word )
small_words = %w[on the and]
word.split(' ').map.with_index do |w, i|
unless (small_words.include? w) and (i > 0)
w.capitalize
else
w
end
end.join(' ')
end
答案 3 :(得分:-1)
SmallWords = %w[on the and]
def title word
word.gsub(/[\w']+/){
SmallWords.include?($&) && $~.begin(0).zero?.! ? $& : $&.capitalize
}
end