Ruby 没有下套管的标题化

Ruby 没有下套管的标题化,ruby,ruby-on-rails-4,Ruby,Ruby On Rails 4,使用Ruby 2.1.3和Rails 4.1.6。 我一直在使用.titleize清理一些用户输入,例如 'new york'.titleize => "New York" 但是,titleize也可以在不需要时通过下套管中断正确的用户输入: 'New York, NY'.titleize => "New York, Ny" 有没有一种干净的方法可以在没有任何下框的情况下进行标题化?如果您希望使用大小写混合的单词,并且希望保持大小写混合,我会这样做: def titlize

使用Ruby 2.1.3和Rails 4.1.6。 我一直在使用.titleize清理一些用户输入,例如

'new york'.titleize
 => "New York" 
但是,titleize也可以在不需要时通过下套管中断正确的用户输入:

'New York, NY'.titleize
 => "New York, Ny"

有没有一种干净的方法可以在没有任何下框的情况下进行标题化?

如果您希望使用大小写混合的单词,并且希望保持大小写混合,我会这样做:

def titlize(str)
  r = str.split.map { |word| word.size > 2 ? word.titleize : word.capitalize }
  r.join(" ")
end
def titleize_without_downcasing(string)
  string.gsub(/(\w|')(\w*)/) { $1.upcase + $2 }
end

titleize_without_downcasing('new york, NY, UsA')
#=> 'New York, NY, UsA'

titleize_without_downcasing("doctor's")
#=> "Doctor's"

那“美国纽约州纽约市”呢?这就是OP想要的。书名上写着:没有下套管的标题。我确保我不会通过调用已大写的
titleize
来更改单词。对,您的答案+1.)我只是不懂这行代码
string.gsub(/(\w)(\w*)/){word |$1.upcase+$2}
你能解释一下吗?Regexp将匹配相同的单词。但是,有两个捕获组而不是一个捕获组使得处理第一个字符(捕获在
$1
中)和单词的其余部分(捕获在
$2
中)更加容易<代码>$1.upcase+$2的内容是:始终将第一个字符(来自
(\w)
)大写,然后添加单词的其余部分(来自
(\w*)
),而不做任何更改。我一直在寻找没有下框的标题。谢谢另一个选项不起作用,正如所指出的:titleize__abbr(‘纽约,纽约,美国’)=>“纽约,纽约,美国A”(添加了不需要的空格)