在Ruby中将字符串转换为大小写
正在进行一项Ruby挑战,将破折号/下划线分隔的单词转换为驼峰式大小写。只有当原始单词被称为大写时,输出中的第一个单词才应该大写 到目前为止,我的解决方案是:在Ruby中将字符串转换为大小写,ruby,Ruby,正在进行一项Ruby挑战,将破折号/下划线分隔的单词转换为驼峰式大小写。只有当原始单词被称为大写时,输出中的第一个单词才应该大写 到目前为止,我的解决方案是: def to_camel_case(str) str.split('_,-').collect.camelize(:lower).join end 然而,camelize:lower是一种rails方法,我相信它不适用于Ruby。有没有同样简单的替代方法?我好像找不到。还是我需要从一个完全不同的角度面对挑战 main.rb:4:in
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>'
大多数Rails方法都可以添加到基本Ruby项目中,而不必拉入整个Rails源代码 诀窍是找出定义所需方法所需的最小文件量。如果我们转到,我们可以看到camelize是在active_support/inflector/methods.rb中定义的 因此,积极的支持/拐点似乎是一个很好的尝试对象。让我们测试一下:
irb(main)> require 'active_support/inflector'
=> true
irb(main)> 'foo_bar'.camelize
=> "FooBar"
似乎有效。请注意,这假设您之前已经运行了gem安装activesupport。如果没有,则先执行或将其添加到您的GEM文件中。我假设:
每个单词由一个或多个部分组成。
每个部分由空格、加高和下划线以外的组成字符组成。
每个部分的第一个字符是一个字母。
每个连续的零件对都用连字符或下划线分隔。
需要返回一个字符串,该字符串是通过修改每个部分并删除分隔每个连续部分对的hypen或下划线获得的。
对于每个部分,除第一个字母外,所有字母均应转换为小写字母。
单词每个部分中非字母的所有字符应保持不变。
第一部分的第一个字母保持不变。
除第一个字母外,每个部分的第一个字母如果尚未大写,则应大写。
单词之间用空格隔开。
如果正确描述了问题,可以使用以下方法
R = /(?:(?<=^| )|[_-])[A-Za-z][^ _-]*/
正则表达式可以在自由间距模式下编写,以使其自文档化
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
在纯Ruby中,没有Rails,如果str='my-var_name',您可以执行以下操作:
delimiters = Regexp.union(['-', '_'])
str.split(delimiters).then { |first, *rest| [first, rest.map(&:capitalize)].join }
#=> "myVarName"
其中str='My-var_name'结果为MyVarName,因为拆分结果的第一个元素未被触及,而其余元素映射为大写
它仅适用于以破折号/下划线分隔的单词,不使用空格,或者需要按空格分割,然后使用呈现的方法进行映射
此方法使用按分隔符拆分的字符串,如下所述,
用链子拴住。就在我头顶上,这看起来像是个错误;您希望收集camelize的结果,而不是对collect的结果调用camelize,而不使用块。试试这个:str.split'.''.'.collect&:camelize.joinah是正确的,但我不想大写第一个字符,而且,我得到了一个新的错误消息collect:“undefined method camelize”,用于“隐身战士”:String。如果原始字符串如下:小muffet小姐坐在她的塔夫特上,您希望返回什么字符串?破折号是指连字符吗?分割的部分看起来不太正确。我将使用split/|-/。感谢您提供了非常详细的分类和答案
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
delimiters = Regexp.union(['-', '_'])
str.split(delimiters).then { |first, *rest| [first, rest.map(&:capitalize)].join }
#=> "myVarName"