在If,Else Statement中测试正则表达式

时间:2013-04-04 14:32:28

标签: ruby regex

我认为我很接近,但正则表达式没有评估。希望有人知道为什么。

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

当我传入小写标题时,它们会以小写形式返回。

3 个答案:

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

Se the doc.

如果您想要花哨的标题,请查看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