Ruby首字母大写每个单词

byC*_*der 159 ruby string

我需要将每个单词的第一个字符设为大写字母,然后将其余字母设为小写字母...

manufacturer.MFA_BRAND.first.upcase
Run Code Online (Sandbox Code Playgroud)

只设置第一个字母大写,但我需要这个:

ALFA ROMEO => Alfa Romeo
AUDI => Audi
BMW => Bmw
ONETWO THREE FOUR => Onetwo Three Four
Run Code Online (Sandbox Code Playgroud)

bou*_*uby 268

在Rails中:

"kirk douglas".titleize => "Kirk Douglas"
#this also works for 'kirk_douglas'
Run Code Online (Sandbox Code Playgroud)

没有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
Run Code Online (Sandbox Code Playgroud)

没有Rails(加载rails的ActiveSupport来修补#titleize方法String)

require 'active_support/core_ext'
"kirk douglas".titleize #=> "Kirk Douglas"
Run Code Online (Sandbox Code Playgroud)

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

  • "kirk douglas"
  • "kirk_douglas"
  • "柯克 - 道格拉斯"
  • "柯克·道格拉斯"
  • "柯克·道格拉斯"

#titleize陷阱

#titleize方法比最初期望的方法复杂一点,并且会产生意想不到的结果,尤其是@JamesMcMahon所指出的区分大小写的情况:

"hEy lOok".titleize #=> "H Ey Lo Ok"
Run Code Online (Sandbox Code Playgroud)

因为它意味着处理像骆驼一样的代码:

"kirkDouglas".titleize #=> "Kirk Douglas"
Run Code Online (Sandbox Code Playgroud)

要处理这种边缘情况,您可以titleize在运行#titleize之前先清理字符串.当然,如果你这样做,你将消灭任何基于camelCased的单词分隔:

"kirkDouglas".downcase.titleize #=> "Kirkdouglas"
Run Code Online (Sandbox Code Playgroud)

  • 巨大的GOTCHA,标题化将完全删除某些字符,例如破折号( - )."谁? - 我".titleize =>"谁?我" (8认同)
  • Titleize并不像它看起来那么简单,例如'hEy LoOK'成为'H Ey Lo Ok' (6认同)
  • Rails中的.titleize工作完美! (2认同)

小智 212

试试这个:

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

#=> One Two Three Four
Run Code Online (Sandbox Code Playgroud)

要么

puts 'one TWO three foUR'.split.map(&:capitalize)*' '
Run Code Online (Sandbox Code Playgroud)

  • 默认情况下,`split`会在空格上分割,所以你可以缩短它:`'一个TWO三个foUR'.split.map(&:capitalize).join('')` (7认同)
  • @macsplean`map`中的`&:method`语法是[在数组中每个项目上调用方法的简明方法](http://stackoverflow.com/questions/1217088/what-does-ampersand-colon-饼干,结肠均在旁注).然后,您可以调用`join`将该数组转换为字符串."*"是一种[调用连接的替代方式](http://brettu.com/ruby-ruby-tips-236-alternative-arrayjoin-syntax/).您可以将其视为将数组中的项相乘以创建字符串. (6认同)

小智 37

"hello world".titleize 哪个应输出"Hello World".

  • 这不是Ruby方法; 它是v2.2.1中引入的ActiveSupport(Rails)方法 (3认同)

Bob*_*ler 20

另一个选择是使用正则表达式和gsub,它采用一个块:

'one TWO three foUR'.gsub(/\w+/, &:capitalize)
Run Code Online (Sandbox Code Playgroud)

  • 这保留了单词间的破折号等。 (2认同)
  • `.gsub(/\b\w /,&:capitalize)`保留单词中的预期大写,例如"Jane mcCollins" (2认同)

Muh*_*ais 5

"hello world".split.each{|i| i.capitalize!}.join(' ')
Run Code Online (Sandbox Code Playgroud)

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