除了中间和开头的小词之外,如何将字符串中的所有单词大写?

时间:2013-07-13 23:16:06

标签: ruby

我有一根长绳子,“背上的银色骑手和棕榈树”。我想写一个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”。

4 个答案:

答案 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