【发布时间】:2012-10-10 16:12:13
【问题描述】:
str = 'foo_bar baz __goo'
应该打印为
Foo Bar Baz Goo
尝试使用split /(\s|_)/,但它返回'_' 和' ' 以及多个空格...?
Ruby 1.9.3
【问题讨论】:
标签: ruby regex string ruby-1.9.3
str = 'foo_bar baz __goo'
应该打印为
Foo Bar Baz Goo
尝试使用split /(\s|_)/,但它返回'_' 和' ' 以及多个空格...?
Ruby 1.9.3
【问题讨论】:
标签: ruby regex string ruby-1.9.3
试试这个:
str.split(/[\s_]+/).map(&:classify).join(" ")
如果您可以获得积极的支持,或者
str.split(/[\s_]+/).map(&:capitalize).join(" ")
如果你想要纯红宝石。
【讨论】:
capitalize 更简单,没有不必要的复杂性。 classify 似乎在内部使用 camelize 和 singularize。来自积极支持的titleize 也在内部使用capitalize 以及另外两个功能。
假设您的意思是/(\s|_)/(斜线的方向很重要!),您的正则表达式非常接近。您在结果中获得分隔符(空格和下划线)的原因是括号:它们指示拆分器将分隔符包含在返回的数组中。
你得到额外的空字符串的原因是你在\s上拆分,它匹配一个空格(或制表符),或者'_',它匹配一个下划线。如果您想将任意数量的空格或下划线视为单个分隔符,则需要在您的正则表达式中添加 + - 这表示“一个或多个先前的事物”。
但是\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(" ")
【讨论】: