str = 'foo_bar baz __goo'
应该打印为
Foo Bar Baz Goo
尝试使用split /(\s|_)/
,但它返回'_'
and' '
和多个空格...?
红宝石 1.9.3
str = 'foo_bar baz __goo'
应该打印为
Foo Bar Baz Goo
尝试使用split /(\s|_)/
,但它返回'_'
and' '
和多个空格...?
红宝石 1.9.3
尝试这个:
str.split(/[\s_]+/).map(&:classify).join(" ")
如果您可以获得积极的支持,或者
str.split(/[\s_]+/).map(&:capitalize).join(" ")
如果你想要纯红宝石。
假设您的意思是/(\s|_)/
(斜线的方向很重要!),您的正则表达式非常接近。您在结果中获得分隔符(空格和下划线)的原因是括号:它们指示拆分器将分隔符包含在返回的数组中。
你得到额外的空字符串的原因是你正在拆分\s
,它只匹配一个空格(或制表符),或者'_',它只匹配一个下划线。如果您想将任意数量的空格或下划线视为单个分隔符,您需要添加+
到您的正则表达式 - 这意味着“一个或多个先前的东西”。
but\s|_+
表示“一个空格,或一个或多个下划线”。您想将 应用于+
整个表达式,而不仅仅是_
. 这让我们回到了括号。在这种情况下,您希望将两个备选方案组合在一起而不捕获(并返回)它们;语法是(?:...)
. 所以这是结果:
str.split(/(?:\s|_)+/)
现在,如果你想规范化大小写,你想capitalize
在每个字符串上运行,你可以用 来做map
,像这样:
str.split(/(?:\s|_)+/).map { |s| s.capitalize }
或使用快捷方式:
str.split(/(?:\s|_)+/).map(&:capitalize)
到目前为止,所有这些解决方案都返回一个字符串数组,您可以用它来做各种事情。但是,如果您只想将它们重新组合成一个字符串,则可以使用join
. 例如,将它们放在一起并在它们之间留一个空格:
str.split(/(?:\s|_)+/).map(&:capitalize).join ' '
尝试拆分字符串:
[\s_]+
使用/[\ _]+/
,它会查找一个或多个出现或空格或下划线。通过这种方式,它能够消除多个下划线、空格或两者的组合。之后你得到一个数组,所以你用它map
来转换它们中的每一个。稍后您可以使用join
. 查看示例 -
将它们列在列表中 -
str.split(/[\ _]+/).map {|s| s.capitalize }
=> ["Foo", "Bar", "Baz", "Goo"]
将它们作为一个完整的字符串 -
str.split(/[\ _]+/).map {|s| s.capitalize }.join(" ")
=> "Foo Bar Baz Goo"
这里是纯 Ruby 版本:
str = 'foo_bar baz __goo'
str.split(/[ _]+/).map{|s| s[0].upcase+s[1..-1]}.join(" ")