首页 > 解决方案 > 在Ruby中将字符串转换为骆驼大小写

问题描述

处理 Ruby 挑战,将破折号/下划线分隔的单词转换为驼峰式大小写。仅当原始单词大写时,输出中的第一个单词才应大写(称为 Upper Camel Case)。

到目前为止我的解决方案..:

def to_camel_case(str)
str.split('_,-').collect.camelize(:lower).join 
end

但是 .camelize(:lower) 是我相信的 Rails 方法,不适用于 Ruby。有没有同样简单的替代方法?我似乎找不到一个。还是我需要从完全不同的角度来应对挑战?

main.rb:4:in `to_camel_case': undefined method `camelize' for #<Enumerator: []:collect> (NoMethodError)
    from main.rb:7:in `<main>'

标签: ruby

解决方案


我假设:

  • 每个“词”由一个或多个“部分”组成。
  • 每个部分都由空格、连字符和下划线以外的字符组成。
  • 每个部分的第一个字符是一个字母。
  • 每对连续的部分由连字符或下划线分隔。
  • 希望返回通过修改每个部分并删除分隔每对连续部分的连字符或下划线而获得的字符串。
  • 对于每个部分,除第一个以外的所有字母都将转换为小写。
  • 单词的每个部分中的所有非字母字符都应保持不变。
  • 第一部分的第一个字母保持不变。
  • 除了第一个部分之外,每个部分的第一个字母都应大写(如果尚未大写)。
  • 单词用空格分隔。

它正确地描述了问题,可以使用以下方法。

R = /(?:(?<=^| )|[_-])[A-Za-z][^ _-]*/
def to_camel_case(str)
  str.gsub(R) do |s|
    c1 = s[0]
    case c1
    when /[A-Za-z]/
      c1 + s[1..-1].downcase
    else
      s[1].upcase + s[2..-1].downcase
    end
  end
end
to_camel_case "Little Miss-muffet sat_on_HE$R Tuffett eating-her_cURDS And_whey"
  # => "Little MissMuffet satOnHe$r Tuffett eatingHerCurds AndWhey"

正则表达式可以以自由间距模式编写,以使其自记录。

R = /
    (?:         # begin non-capture group
      (?<=^| )  # use a positive lookbehind to assert that the next character
                # is preceded by the beginning of the string or a space
    |           # or
      [_-]      # match '_' or '-'
    )           # end non-capture group
    [A-Za-z]    # match a letter
    [^ _-]*     # match 0+ characters other than ' ', '_' and '-'
    /x          # free-spacing regex definition mode

推荐阅读