将驼峰案例转换为ruby中的下划线案例

Dan*_*ier 222 ruby string formatting ruby-on-rails case-conversion

是否有任何现成的函数将驼峰案例字符串转换为下划线分隔字符串?

我想要这样的东西:

"CamelCaseString".to_underscore      
Run Code Online (Sandbox Code Playgroud)

返回"camel_case_string".

...

jrh*_*cks 354

Rails的ActiveSupport 使用以下内容为String添加下划线:

class String
  def underscore
    self.gsub(/::/, '/').
    gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
    gsub(/([a-z\d])([A-Z])/,'\1_\2').
    tr("-", "_").
    downcase
  end
end
Run Code Online (Sandbox Code Playgroud)

然后你可以做有趣的事情:

"CamelCase".underscore
=> "camel_case"
Run Code Online (Sandbox Code Playgroud)

  • 如果将`tr(" - ","_")`更改为`tr(" - ","_")`(添加到第一个参数的空间),这也会将空格转换为下划线.另外,我认为你甚至不需要包括`self.,或者至少它在Ruby 1.9.3下适合我. (5认同)
  • `require'active_support/core_ext/string'` (4认同)

小智 87

您可以使用

"CamelCasedName".tableize.singularize
Run Code Online (Sandbox Code Playgroud)

要不就

"CamelCasedName".underscore
Run Code Online (Sandbox Code Playgroud)

两种选择方式都会产生"camel_cased_name".您可以在此处查看更多详细信息.

  • 这是ActiveSupport :: Inflector的实现的一部分,没有它,你不能使用那些String扩展(尝试在纯irb控制台:"ThisCamelCaseString".underscore,然后需要'active_support/inflector'并再试一次) (11认同)
  • Downvoted,因为这不是普通的红宝石. (9认同)
  • OP的标签上确实标有“ ruby​​-on-rails” (2认同)

kir*_*hik 55

单行Ruby实现:

class String
   # ruby mutation methods have the expectation to return self if a mutation occurred, nil otherwise. (see http://www.ruby-doc.org/core-1.9.3/String.html#method-i-gsub-21)
   def to_underscore!
     gsub!(/(.)([A-Z])/,'\1_\2')
     downcase!
   end

   def to_underscore
     dup.tap { |s| s.to_underscore! }
   end
end
Run Code Online (Sandbox Code Playgroud)

所以 "SomeCamelCase".to_underscore # =>"some_camel_case"

  • 您可能需要考虑`/([^ AZ])([AZ] +)/`来处理`"ALLCAPS"` - >``allcaps'`而不是'"a_ll_ca_ps"` (6认同)
  • 其他解决方案如何不是纯粹的红宝石? (2认同)
  • 那实际上是10班轮! (2认同)

Aad*_*ain 27

有一个称为"下划线"的Rails内置方法,您可以将其用于此目的

"CamelCaseString".underscore #=> "camel_case_string" 
Run Code Online (Sandbox Code Playgroud)

'下划线'方法通常可以被视为'camelize'的倒数

  • 这是一个ActiveSupport方法 (5认同)

Pes*_*sto 20

以下是Rails的用法:

   def underscore(camel_cased_word)
     camel_cased_word.to_s.gsub(/::/, '/').
       gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
       gsub(/([a-z\d])([A-Z])/,'\1_\2').
       tr("-", "_").
       downcase
   end
Run Code Online (Sandbox Code Playgroud)

  • 最好将操作数作为方法参数而不是侵入核心 String 类。 (2认同)
  • 如果我可以参加这个辩论 - 最好让它入侵字符串类_when_你包括它=). (2认同)

Arm*_*yan 15

如果有人在寻找需要将下划线应用于带空格的字符串并希望将它们转换为下划线的情况下,您可以使用这样的东西

'your String will be converted To underscore'.parameterize.underscore
#your_string_will_be_converted_to_underscore
Run Code Online (Sandbox Code Playgroud)

或者只使用 .parameterize('_') 但请记住,不推荐使用这个

'your String will be converted To underscore'.parameterize('_')
#your_string_will_be_converted_to_underscore
Run Code Online (Sandbox Code Playgroud)


Mr.*_*ack 7

接收器转换为蛇案:http://rubydoc.info/gems/extlib/0.9.15/String#snake_case-instance_method

这是DataMapper和Merb的支持库.(http://rubygems.org/gems/extlib)

def snake_case
  return downcase if match(/\A[A-Z]+\z/)
  gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
  gsub(/([a-z])([A-Z])/, '\1_\2').
  downcase
end

"FooBar".snake_case           #=> "foo_bar"
"HeadlineCNNNews".snake_case  #=> "headline_cnn_news"
"CNN".snake_case              #=> "cnn"
Run Code Online (Sandbox Code Playgroud)


Abr*_*ram 7

从Ruby Facets查看snakecase

处理以下案例,如下所示:

"SnakeCase".snakecase         #=> "snake_case"
"Snake-Case".snakecase        #=> "snake_case"
"Snake Case".snakecase        #=> "snake_case"
"Snake  -  Case".snakecase    #=> "snake_case"
Run Code Online (Sandbox Code Playgroud)

来自:https://github.com/rubyworks/facets/blob/master/lib/core/facets/string/snakecase.rb

class String

  # Underscore a string such that camelcase, dashes and spaces are
  # replaced by underscores. This is the reverse of {#camelcase},
  # albeit not an exact inverse.
  #
  #   "SnakeCase".snakecase         #=> "snake_case"
  #   "Snake-Case".snakecase        #=> "snake_case"
  #   "Snake Case".snakecase        #=> "snake_case"
  #   "Snake  -  Case".snakecase    #=> "snake_case"
  #
  # Note, this method no longer converts `::` to `/`, in that case
  # use the {#pathize} method instead.

  def snakecase
    #gsub(/::/, '/').
    gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
    gsub(/([a-z\d])([A-Z])/,'\1_\2').
    tr('-', '_').
    gsub(/\s/, '_').
    gsub(/__+/, '_').
    downcase
  end

  #
  alias_method :underscore, :snakecase

  # TODO: Add *separators to #snakecase, like camelcase.

end
Run Code Online (Sandbox Code Playgroud)


And*_*eis 5

当你还包含空格时,CamelCases的短连接器(如果你的中间有一个带有小字母的单词,则无法正常工作):

a = "Test String"
a.gsub(' ', '').underscore

  => "test_string"
Run Code Online (Sandbox Code Playgroud)

  • ‘下划线’不是 ruby​​ 的一部分 (2认同)