我认为我很接近,但正则表达式没有评估。希望有人知道为什么。
def new_title(title)
words = title.split(' ')
words = [words[0].capitalize] + words[1..-1].map do |w|
if w =~ /and|an|a|the|in|if|of/
w
else
w.capitalize
end
end
words.join(' ')
end
当我传入小写标题时,它们会以小写形式返回。
答案 0 :(得分:3)
您需要正确锚定正则表达式:
new_title("the last hope")
# => "The last Hope"
这是因为/a/
匹配其中包含a
的字词。 /\Aa\Z/
匹配一个完全由a
组成的字符串,/\A(a|of|...)\Z/
与一组字词匹配。
无论如何,你可能想要的是:
case (w)
when 'and', 'an', 'a', 'the', 'in', 'if', 'of'
w
else
w.capitalize
end
在这里使用正则表达式有点沉重。你想要的是一个排除列表。
答案 1 :(得分:1)
这称为titleize,实现方式如下:
def titleize(word)
humanize(underscore(word)).gsub(/\b('?[a-z])/) { $1.capitalize }
end
如果您想要花哨的标题,请查看granth's titleize
答案 2 :(得分:0)
你的正则表达式应该检查整个单词(^word$
)。无论如何,使用Enumerable#include?
并不是更简单:
def new_title(title)
words = title.split(' ')
rest_words = words.drop(1).map do |word|
%w(and an a the in if of).include?(word) ? word : word.capitalize
end
([words[0].capitalize] + rest_words).join(" ")
end