1

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

4 回答 4

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
于 2013-07-13T23:30:30.507 回答
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”——但我认为这可能就是你想要的。

于 2013-07-13T23:23:27.097 回答
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
于 2013-07-13T23:29:00.063 回答
-1
SmallWords = %w[on the and]
def title word
  word.gsub(/[\w']+/){
    SmallWords.include?($&) && $~.begin(0).zero?.! ? $& : $&.capitalize
  }
end
于 2013-07-14T00:18:18.437 回答