【问题标题】:Eloquent way to format string in Ruby?在Ruby中格式化字符串的雄辩方式?
【发布时间】:2012-10-10 16:12:13
【问题描述】:
str = 'foo_bar    baz  __goo'

应该打印为

Foo Bar Baz Goo

尝试使用split /(\s|_)/,但它返回'_'' ' 以及多个空格...?

Ruby 1.9.3

【问题讨论】:

    标签: ruby regex string ruby-1.9.3


    【解决方案1】:

    试试这个:

    str.split(/[\s_]+/).map(&:classify).join(" ")
    

    如果您可以获得积极的支持,或者

    str.split(/[\s_]+/).map(&:capitalize).join(" ")
    

    如果你想要纯红宝石。

    【讨论】:

    • 即使您有积极的支持,为什么您更喜欢分类而不是大写?
    • capitalize 更简单,没有不必要的复杂性。 classify 似乎在内部使用 camelizesingularize。来自积极支持的titleize 也在内部使用capitalize 以及另外两个功能。
    • 分类是 activesupport api 的一部分。如果上述示例在 Rails 上下文中专门用于访问类的情况,我无论如何都会使用分类,因为这种情况:“account_user”.classify => “AccountUser”。 "account_user".capitalize => "Account_user"。如果这不是示例的目的,那么我会使用普通的 ruby​​,大写,反正更轻。
    • 那么,回复有帮助吗?
    【解决方案2】:

    假设您的意思是/(\s|_)/(斜线的方向很重要!),您的正则表达式非常接近。您在结果中获得分隔符(空格和下划线)的原因是括号:它们指示拆分器将分隔符包含在返回的数组中。

    你得到额外的空字符串的原因是你在\s上拆分,它匹配一个空格(或制表符),或者'_',它匹配一个下划线。如果您想将任意数量的空格或下划线视为单个分隔符,则需要在您的正则表达式中添加 + - 这表示“一个或多个先前的事物”。

    但是\s|_+ 的意思是“一个空格,或者一个或多个下划线”。您想将+ 应用于整个表达式,而不仅仅是_。这让我们回到了括号。在这种情况下,您希望将两个备选方案组合在一起而不捕获(并返回)它们;其语法为(?:...)。结果是这样的:

    str.split(/(?:\s|_)+/) 
    

    现在,如果你想规范化大小写,你想在每个字符串上运行capitalize,你可以用map来做,像这样:

    str.split(/(?:\s|_)+/).map { |s| s.capitalize }
    

    或使用快捷方式:

    str.split(/(?:\s|_)+/).map(&:capitalize)
    

    到目前为止,所有这些解决方案都返回一个字符串数组,您可以用它来做各种事情。但是,如果您只想将它​​们重新组合成一个字符串,则可以使用join。例如,将它们放在一起并在它们之间留一个空格:

    str.split(/(?:\s|_)+/).map(&:capitalize).join ' '
    

    【讨论】:

      【解决方案3】:

      尝试拆分字符串:

      [\s_]+
      

      【讨论】:

        【解决方案4】:

        使用/[\ _]+/,它会查找一个或多个匹配项、空格或下划线。通过这种方式,它能够消除多个下划线、空格或两者的组合。之后你得到一个数组,所以你使用map 来转换它们中的每一个。稍后您可以使用join 将它们组合在一起。查看示例 -

        将它们列在列表中 -

        str.split(/[\ _]+/).map {|s| s.capitalize }
         => ["Foo", "Bar", "Baz", "Goo"] 
        

        将它们作为一个完整的字符串 -

        str.split(/[\ _]+/).map {|s| s.capitalize }.join(" ")
         => "Foo Bar Baz Goo" 
        

        【讨论】:

          【解决方案5】:

          这里是纯 Ruby 版本:

          str = 'foo_bar    baz  __goo'
          str.split(/[ _]+/).map{|s| s[0].upcase+s[1..-1]}.join(" ")
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-08-11
            • 1970-01-01
            • 2015-03-15
            • 2017-04-18
            相关资源
            最近更新 更多