【问题标题】:Convert Sentence to Camelcase in Ruby [duplicate]在Ruby中将句子转换为Camelcase [重复]
【发布时间】:2014-01-03 22:49:07
【问题描述】:

这似乎很容易,但我在任何地方都找不到将句子字符串/连字符字符串转换为驼峰式的方法。

Ex:
'this is a sentence' => 'thisIsASentence'
'my-name' => 'myName'

使用正则表达式似乎有点矫枉过正。最好的方法是什么?

【问题讨论】:

  • 你尝试过任何形式的循环吗?
  • @JustinWood 问题不在于它,而是用最少的代码行找到最好的方法。
  • @bredikhin 来自snake case,而不是sentence case
  • @ElijahMurray 最好的方法不一定是代码行数最少。请记住这一点。

标签: ruby-on-rails ruby


【解决方案1】:
> s = 'this is a sentence'
 => "this is a sentence"
> s.gsub(/\s(.)/) {|e| $1.upcase}
 => "thisIsASentence"

您需要调整该正则表达式以匹配破折号和空格,但这很容易。

很确定也有一种正则表达式方法可以做到这一点,而无需使用块形式,但我没有查。

【讨论】:

  • 是的,这行得通,但它似乎太过分了。有一个dasherize 方法和一个underscore 方法。有没有类似的东西可以捕捉空间?
  • 我对此表示怀疑。去看看这些(和骆驼化)方法的 Rails 源代码。是一样的,他们只是把它包得很好。
【解决方案2】:
'this is a sentence'.split.map.with_index { |x,i| i == 0 ? x : x.capitalize  }.join # => "thisIsASentence"

【讨论】:

    【解决方案3】:

    使用 Rails 的 ActiveSupport,以下两种情况都适用:

    "this is a sentence".underscore.parameterize("_").camelize(:lower)
    # => "thisIsASentence"
    
    "my-name".underscore.parameterize("_").camelize(:lower)
    # => "myName"
    

    underscore 转换任何破折号,parameterize 转换空格。

    【讨论】:

      【解决方案4】:

      如果您使用ActiveSupport(例如因为 Rails 或任何其他依赖项),请查看ActiveSupport::Inflector 模块。任何String 都可以立即使用这些方法。

      'egg_and_hams'.classify # => "EggAndHam"
      'posts'.classify        # => "Post"
      

      请记住,Ruby 中的标准分隔符是_,而不是-。这意味着您可能需要更换它。

      'my-name'.tr('-', '_').classify
       => "MyName" 
      'my-name'.tr('-', '_').camelize(:lower)
       => "myName" 
      

      使用 ActiveSupport 只是委派工作。请记住,在后台,Ruby 中的这些转换很可能是使用正则表达式执行的。

      事实上,在 Ruby 中,正则表达式既便宜又很常见。

      【讨论】:

        【解决方案5】:

        您正在寻找String#camelize

        "test_string".camelize(:lower)           # => "testString"
        

        如果您使用的是下划线以外的其他分隔符,请使用 gsub 方法在骆驼化之前将其他字符替换为下划线。

        【讨论】:

        • 不,我不是。如果你这样做 "test string".camelize(:lower) 它返回 "test string"
        • 如果你使用了除下划线以外的其他分隔符,你可以在驼峰化之前使用 gsub 方法将其他字符替换为下划线。
        猜你喜欢
        • 2012-03-20
        • 1970-01-01
        • 2016-05-16
        • 1970-01-01
        • 2012-02-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-24
        • 2010-12-08
        相关资源
        最近更新 更多