繁体   English   中英

Ruby 将每个单词的第一个字母大写

[英]Ruby capitalize every word first letter

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

manufacturer.MFA_BRAND.first.upcase

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

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

在导轨中:

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

不带导轨:

"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 处理的(一些)字符串用例

  • “柯克·道格拉斯”
  • “柯克道格拉斯”
  • “柯克-道格拉斯”
  • “柯克道格拉斯”
  • “柯克道格拉斯”

#titleize 陷阱

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

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

因为它是为了处理像骆驼那样的代码:

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

为了应对这种边缘情况下,你可以清理你的字符串#downcase首先运行#titleize之前。 当然,如果你这样做,你将消除任何驼峰式分词:

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

试试这个:

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

#=> One Two Three Four

要么

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

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

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

'one TWO three foUR'.gsub(/\w+/, &:capitalize)
"hello world".split.each{|i| i.capitalize!}.join(' ')

如果您试图将数组中每个单词的第一个字母大写,您可以简单地输入:

array_name.map(&:大写)

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

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

这处理了我在尝试以前的答案时看到的以下奇怪情况:

  • 非单词字符,如 -
  • é 等名称中常见的重音字符
  • 字符串中间的大写字符

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM