问题描述
应对Ruby挑战,将破折号/下划线分隔的单词转换为驼峰式大写字母。仅当原始单词为大写字母时,输出中的第一个单词才应大写(称为Upper Camel Case)。
到目前为止我的解决方案..
[1,2,3,4,5,6,7]
但是,我相信.camelize(:lower)是一种Rails方法,不适用于Ruby。是否有一种替代方法,同样简单?我似乎找不到一个。还是我需要从一个完全不同的角度来应对挑战?
def to_camel_case(str)
str.split('_,-').collect.camelize(:lower).join
end
解决方法
我认为:
- 每个“词”由一个或多个“部分”组成。
- 每个部分均由空格,连字符和下划线以外的其他字符组成。
- 每个部分的第一个字符是字母。
- 每对连续的部分之间用连字符或下划线隔开。
- 希望返回一个字符串,该字符串是通过修改每个部分并删除分隔每对连续部分的连字符或下划线获得的。
- 对于每个部分,除第一个字母外,所有字母均应转换为小写字母。
- 单词每个部分中不是字母的所有字符都应保持不变。
- 第一部分的第一个字母保持不变。
- 除第一个字母外,每个部分的第一个字母都要大写(如果尚未大写)。
- 单词之间用空格隔开。
它正确地描述了问题,可以使用以下方法。
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
,
大多数Rails方法都可以添加到基本的Ruby项目中,而不必引入整个Rails源代码。
诀窍是找出所需的最小文件量,以定义所需的方法。如果转到APIDock,我们可以看到camelize
在active_support/inflector/methods.rb
中已定义。
因此,active_support/inflector
似乎是一个不错的尝试。让我们测试一下:
irb(main)> require 'active_support/inflector'
=> true
irb(main)> 'foo_bar'.camelize
=> "FooBar"
似乎可以正常工作。请注意,这是假设您之前已经运行过gem install activesupport
。如果没有,那么请先执行(或将其添加到您的Gemfile中)。
在纯Ruby中,没有Rails,只要waitForElement(By.xpath("//button[@type='submit']"),50);
,您就可以做到:
str = 'my-var_name'
delimiters = Regexp.union(['-','_'])
str.split(delimiters).then { |first,*rest| [first,rest.map(&:capitalize)].join }
#=> "myVarName"
的结果为str = 'My-var_name'
的地方,因为分割结果的"MyVarName"
元素未受影响,而first
被映射为大写。
它仅适用于“用短划线/下划线分隔的单词”,没有空格,或者您需要按空格分割,然后使用显示的方法进行映射。
此方法使用定界符分割字符串,如此处Split string by multiple delimiters所述, 与Object#then链接。