ruby - 在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>'
解决方案
我假设:
- 每个“词”由一个或多个“部分”组成。
- 每个部分都由空格、连字符和下划线以外的字符组成。
- 每个部分的第一个字符是一个字母。
- 每对连续的部分由连字符或下划线分隔。
- 希望返回通过修改每个部分并删除分隔每对连续部分的连字符或下划线而获得的字符串。
- 对于每个部分,除第一个以外的所有字母都将转换为小写。
- 单词的每个部分中的所有非字母字符都应保持不变。
- 第一部分的第一个字母保持不变。
- 除了第一个部分之外,每个部分的第一个字母都应大写(如果尚未大写)。
- 单词用空格分隔。
它正确地描述了问题,可以使用以下方法。
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
推荐阅读
- laravel - 在 laravel 中从 localhost 转移到 127 服务器
- flutter - 在 Flutter 2.0.4 版本上删除了 Listview 计数和构建器属性
- asp.net - 如何在 ASP.NET Core 3.1 API 中显示指定的列数据
- html - Bootstrap 不会将我的两张表放在相邻的两列中
- firefox - 我可以在浏览器中延迟或禁用鼠标悬停弹出窗口吗?
- google-admin-sdk - 在 Google 工作区和管理控制台中删除组后再次创建同一组时,API 中出现 409 冲突问题的警告
- python - Matplotlib 实时更新
- c++ - 获取数组输入并打印数组(C++)
- node.js - 快速会话在页面重新加载后过期
- amazon-web-services - 如何保持容器在 ECS 中运行