0
str = 'foo_bar    baz  __goo'

应该打印为

Foo Bar Baz Goo

尝试使用split /(\s|_)/,但它返回'_'and' '和多个空格...?

红宝石 1.9.3

4

5 回答 5

3

尝试这个:

str.split(/[\s_]+/).map(&:classify).join(" ")

如果您可以获得积极的支持,或者

str.split(/[\s_]+/).map(&:capitalize).join(" ")

如果你想要纯红宝石。

于 2012-10-10T16:18:00.790 回答
2

假设您的意思是/(\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 ' '
于 2012-10-10T16:37:12.520 回答
2

尝试拆分字符串:

[\s_]+
于 2012-10-10T16:15:21.250 回答
1

使用/[\ _]+/,它会查找一个或多个出现或空格或下划线。通过这种方式,它能够消除多个下划线、空格或两者的组合。之后你得到一个数组,所以你用它map来转换它们中的每一个。稍后您可以使用join. 查看示例 -

将它们列在列表中 -

str.split(/[\ _]+/).map {|s| s.capitalize }
 => ["Foo", "Bar", "Baz", "Goo"] 

将它们作为一个完整的字符串 -

str.split(/[\ _]+/).map {|s| s.capitalize }.join(" ")
 => "Foo Bar Baz Goo" 
于 2012-10-10T17:19:47.657 回答
1

这里是纯 Ruby 版本:

str = 'foo_bar    baz  __goo'
str.split(/[ _]+/).map{|s| s[0].upcase+s[1..-1]}.join(" ")
于 2012-10-10T17:19:50.783 回答