代码之家  ›  专栏  ›  技术社区  ›  Daniel Cukier

在ruby中将驼峰大小写转换为下划线大小写

  •  200
  • Daniel Cukier  · 技术社区  · 16 年前

    是否有任何就绪函数可以将大小写字符串转换为下划线分隔的字符串?

    我想要这样的东西:

    "CamelCaseString".to_underscore      
    

    ...

    9 回复  |  直到 7 年前
        1
  •  393
  •   Paweł Gościcki Ywain    12 年前

    Rails' ActiveSupport 使用以下命令向字符串添加下划线:

    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
    

    "CamelCase".underscore
    => "camel_case"
    
        2
  •  119
  •   oxfist Dominik Goltermann    8 年前

    你可以用

    "CamelCasedName".tableize.singularize
    

    "CamelCasedName".underscore
    

    两种选择方式都会让步 "camel_cased_name" . 您可以查看更多详细信息 here

        3
  •  58
  •   Samy Dindane    13 年前

    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
    

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

        4
  •  30
  •   Aaditi Jain    11 年前

    有一个Rails内置的方法叫做“下划线”,可以用于此目的

    "CamelCaseString".underscore #=> "camel_case_string" 
    

    “下划线”方法通常可以被视为“camelize”的逆方法

        5
  •  21
  •   Pesto    16 年前

    Rails does it :

       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
    
        6
  •  15
  •   Arman Petrosyan    6 年前

    如果有人需要将下划线应用于带空格的字符串,并希望将其转换为下划线,那么您可以使用类似的方法

    'your String will be converted To underscore'.parameterize.underscore
    #your_string_will_be_converted_to_underscore
    

    'your String will be converted To underscore'.parameterize('_')
    #your_string_will_be_converted_to_underscore
    
        7
  •  12
  •   Andres    5 年前

    如果还包含空格,则为CamelCases编写简短的单行线(如果中间有一个开头字母较小的单词,则无法正常工作):

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

    编辑:

        8
  •  8
  •   Mr. Black    14 年前

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

    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"
    
        9
  •  8
  •   Abram    10 年前

    退房 蛇壳 Ruby Facets

    处理以下情况,如下所示:

    "SnakeCase".snakecase         #=> "snake_case"
    "Snake-Case".snakecase        #=> "snake_case"
    "Snake Case".snakecase        #=> "snake_case"
    "Snake  -  Case".snakecase    #=> "snake_case"
    

    发件人: 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
    
        10
  •  2
  •   magynhard    6 年前

    ruby内核本身不支持将字符串从(大写)驼峰大小写转换为(也称为pascal大小写)下划线(也称为snake大小写)。

    因此,您需要自己实现或使用现有的gem。

    有一颗小红宝石叫做 幸运案例 它允许您轻松地将字符串从支持的10+个案例中的任意一个转换为另一个案例:

    require 'lucky_case'
    
    # convert to snake case string
    LuckyCase.snake_case('CamelCaseString')      # => 'camel_case_string'
    # or the opposite way
    LuckyCase.pascal_case('camel_case_string')   # => 'CamelCaseString'
    

    require 'lucky_case/string'
    
    'CamelCaseString'.snake_case  # => 'camel_case_string'
    'CamelCaseString'.snake_case! # => 'camel_case_string' and overwriting original
    

    有关更多示例和文档,请查看官方存储库:

    https://github.com/magynhard/lucky_case

        11
  •  2
  •   rplaurindo    5 年前

    class String
    
      # \n returns the capture group of "n" index
      def snakize
        self.gsub(/::/, '/')
        .gsub(/([a-z\d])([A-Z])/, "\1_\2")
        .downcase
      end
    
      # or
    
      def snakize
        self.gsub(/::/, '/')
        .gsub(/([a-z\d])([A-Z])/) do
          "#{$1}_#{$2}"
        end
        .downcase
      end
    
    end
    

    猴斑 String 班有些类以两个或更多大写字母开头。

        12
  •  0
  •   Rimian    5 年前

    我跑步有困难 "CamelCaseString".underscore 在rake任务中。这帮助了我:

    ActiveSupport::Inflector.underscore "CamelCaseString"
    => "camel_case_string"