Ruby将每个单词的首字母大写


162

我需要将每个单词的第一个字符大写,其余的都小写...

manufacturer.MFA_BRAND.first.upcase

只将首字母设置为大写,但是我需要这样做:

ALFA ROMEO => Alfa Romeo
AUDI => Audi
BMW => Bmw
ONETWO THREE FOUR => Onetwo Three Four

Answers:


217

试试这个:

puts 'one TWO three foUR'.split.map(&:capitalize).join(' ')

#=> One Two Three Four

要么

puts 'one TWO three foUR'.split.map(&:capitalize)*' '

7
split会默认拆分为空格,因此您可以将其缩短:'one TWO three foUR'.split.map(&:capitalize).join(' ')
Mischa 2013年

@waltee您能否解释.map(&:capitalize)或至少指向您在文档中找到它的位置?我找不到任何参考。另外,*' '第二个代码片段结尾处的处理是什么?
macsplean

6
@macsplean &:method语法map是一种在数组中每个项目上调用方法简洁方法。然后,您可以调用join将该数组转换为字符串。这* ' '调用join另一种方法。您可以将其视为将数组中的各项相乘以创建一个字符串。
安德鲁

283

在Rails中:

"kirk douglas".titleize => "Kirk Douglas"
#this also works for 'kirk_douglas'

不含Rails:

"kirk douglas".split(/ |\_/).map(&:capitalize).join(" ")

#OBJECT IT OUT
def titleize(str)
  str.split(/ |\_/).map(&:capitalize).join(" ")
end

#OR MONKEY PATCH IT
class String  
  def titleize
    self.split(/ |\_/).map(&:capitalize).join(" ")
  end
end

w / o Rails(将Rails的ActiveSupport加载到#titleize方法的补丁中String

require 'active_support/core_ext'
"kirk douglas".titleize #=> "Kirk Douglas"

#titleize处理的(一些)字符串用例

  • “道格拉斯教堂”
  • “ kirk_douglas”
  • “柯克-道格拉斯”
  • “柯克道格拉斯”
  • “柯克道格拉斯”

#titleize陷阱

Rails titleize会将破折号和下划线等内容转换为空格,并可能产生其他意外结果,尤其是@JamesMcMahon指出的区分大小写的情况:

"hEy lOok".titleize #=> "H Ey Lo Ok"

因为它旨在处理骆驼式代码,例如:

"kirkDouglas".titleize #=> "Kirk Douglas"

要处理这种情况,您可以#downcase在运行#titleize之前先使用字符串清理字符串。当然,如果这样做,您将消除所有驼峰式单词分隔:

"kirkDouglas".downcase.titleize #=> "Kirkdouglas"

还有一个宝石标题,可以很好地工作。
zhon

6
Titleize并不像看起来那么简单,例如'hEy LoOK'变成'H Ey Lo Ok'–
James McMahon

8
巨大的GOTCHA,标题化将完全删除某些字符,例如破折号(-)。“谁?-我” .titleize =>“谁?我”
pixelearth 2014年

@pixelearth对我来说,将所有破折号转换为单独的空格。
boulder_ruby 2015年

37

"hello world".titleize 应该输出“ Hello World”。


"One Two Three Fo Ur"在这种情况下,该输出与期望的输出不同,但在其他情况下可能是期望的。
里克·史密斯

3
这不是Ruby方法;它在V2.2.1引入的ActiveSupport(Rails)的方法
扎克伯特

20

另一种选择是使用正则表达式和gsub,这需要一个代码块:

'one TWO three foUR'.gsub(/\w+/, &:capitalize)

这其中蜜饯字间破折号等
啤酒箱

3
.gsub(/\b\w/, &:capitalize)保留单词内的预期大写字母,例如“ Jane mcCollins”
user3680688 '17


3
"hello world".split.each{|i| i.capitalize!}.join(' ')

1
如果您不使用变量,则没有理由使用bang(!)运算符
boulder_ruby

2
@boulder_ruby “如果没有使用变量,没有理由不使用bang运算符”。each块每次迭代的返回值都将被丢弃。在!正在修改所产生的字符串split就地。没有!capitalize将在每次迭代中创建一个新的大写字符串,然后立即将其丢弃。最终结果将是"hello world",与原始字符串相同。使用!split会更改'd数组中的每个字符串,因此的结果each是大写字符串数组。
user513951

1
是的,您应该使用map。有趣的黑客。点
boulder_ruby 2014年

1

如果您试图将每个单词的首字母大写,可以简单地输入以下内容:

array_name.map(&:大写)


0

我用它来解决类似的问题:

'catherine mc-nulty joséphina'.capitalize.gsub(/(\s+\w)/) { |stuff| stuff.upcase }

这处理了以下奇怪的情况,我看到它们尝试了前面的答案:

  • 非单词字符,例如-
  • é中常见的重音字符
  • 字符串中间的大写字母
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.