【问题标题】:Ruby capitalize every word first letterRuby 将每个单词的首字母大写
【发布时间】:2012-11-11 07:00:34
【问题描述】:

我需要把每个单词的第一个字符变成大写,其余的变成小写...

manufacturer.MFA_BRAND.first.upcase

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

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

【问题讨论】:

    标签: ruby string


    【解决方案1】:

    我用这个来解决类似的问题:

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

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

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

    【讨论】:

      【解决方案2】:

      在 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"
      

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

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

      【讨论】:

      • 还有一个 gem titleize 很好用。
      • Titleize 并不像看起来那么简单,例如 'hEy LoOK' 变成 'H Ey Lo Ok'
      • HUGE GOTCHA,titleize 将完全删除某些字符,例如破折号 ( - )。 "谁?-我".titleize => "谁?我"
      • @pixelearth 对我来说它将所有破折号转换为单个空格。
      【解决方案3】:

      如果你想将数组中每个单词的首字母大写,你可以简单地这样写:

      array_name.map(&:capitalize)

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 这输出 "One Two Three Fo Ur" 在这种情况下与所需的输出不同,但在其他情况下可能是所需的。
        • 这不是 Ruby 方法;它是 v2.2.1 中引入的 ActiveSupport (Rails) 方法
        【解决方案5】:

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

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

        【讨论】:

        • 这个保留了单词间破折号等。
        • .gsub(/\b\w/, &:capitalize) 保留单词中的预期大小写,例如“简·麦柯林斯”
        • 使用[[:alpha:]] 代替\w 使其能够识别Unicode。
        【解决方案6】:

        试试这个:

        puts 'one TWO three foUR'.split.map(&:capitalize).join(' ')
        
        #=> One Two Three Four
        

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

        【讨论】:

        • split 默认会在空间上分割,所以你可以让它更短:'one TWO three foUR'.split.map(&:capitalize).join(' ')
        • @waltee 您能否解释一下.map(&:capitalize) 或至少指出您在文档中的哪个位置找到它?我找不到任何参考。还有,第二个代码sn-p末尾的*' '是怎么回事?
        • @macsplean &:method 语法在map 是一个concise way to call a method on each item in the array。然后,您可以调用 join 将该数组转换为字符串。 * ' 'alternative way to call join。您可以将其视为将数组中的项目相乘以创建一个字符串。
        【解决方案7】:
        "hello world".split.each{|i| i.capitalize!}.join(' ')
        

        【讨论】:

        • 如果您不使用变量,则没有理由使用 bang (!) 运算符
        • @boulder_ruby “如果不使用变量,就没有理由使用 bang 运算符”是不正确的。 @ 的每次迭代的返回值987654322@ 块被丢弃。 ! 正在就地修改 split 生成的字符串。如果没有!capitalize 将在每次迭代中创建一个新的大写字符串,然后立即丢弃它。最终结果将是"hello world",与原始字符串相同。使用!split'd 数组中的每个字符串都在更改,因此each 的结果是一个大写字符串数组。
        • 是的,你应该使用map。有趣的黑客虽然。积分
        【解决方案8】:

        【讨论】:

        • String#capitalize 将第一个字母之后的其余字符串小写。对于像“McGee”这样的名字,这是一个不受欢迎的结果,但在这种情况下它部分有用。
        猜你喜欢
        • 2015-11-10
        • 2020-08-30
        • 2015-11-04
        • 2012-07-24
        • 2016-12-05
        • 2016-01-10
        • 1970-01-01
        • 2016-12-23
        • 2017-08-02
        相关资源
        最近更新 更多