如何用红宝石安全地替换所有带有下划线的空格?

时间:2011-09-25 17:02:00

标签: ruby-on-rails ruby ruby-on-rails-3

这适用于任何包含空格的字符串

str.downcase.tr!(" ", "_")

但没有空格的字符串会被删除

所以“New School”会变成“new_school”,但“color”会变成“”,什么都没有!

8 个答案:

答案 0 :(得分:91)

  

有空格

str = "New School"
str.parameterize.underscore

=> "new_school"
  

没有空间

str = "school"
str.parameterize.underscore

=> "school"

编辑: - 我们也可以通过' _'作为参数化的参数。

  

有空格

str = "New School"
str.parameterize('_')

=> "new_school"
  

没有空间

str = "school"
str.parameterize('_')

=> "school"

答案 1 :(得分:36)

tr!的文档说

  

使用与String#tr相同的规则将str转换到位。返回str,如果没有进行任何更改,则返回nil。

如果您在没有感叹号的情况下使用tr,我认为您会得到正确的结果。

答案 2 :(得分:36)

如果您对在snake case中获取字符串感兴趣,那么建议的解决方案并不常用,因为您可能会获得连接的下划线和开始/尾随下划线。

例如

1.9.3-p0 :010 > str= "  John   Smith Beer "
  => "  John   Smith Beer " 
1.9.3-p0 :011 > str.downcase.tr(" ", "_")
  => "__john___smith_beer_"

下面的解决方案会更好用:

1.9.3-p0 :010 > str= "  John   Smith Beer "
  => "  John   Smith Beer " 
1.9.3-p0 :012 > str.squish.downcase.tr(" ","_")
  => "john_smith_beer" 

squish是Rails提供的String方法

答案 3 :(得分:8)

老问题,但是......

对于所有空白,你可能想要更像这样的东西:

"hey\t there   world".gsub(/\s+/, '_') # hey_there_world

这会获得标签和新行以及空格,并替换为单个_

可以修改正则表达式以满足您的需求。 E.g:

"hey\t there   world".gsub(/\s/, '_') # hey__there___world

答案 4 :(得分:8)

如果您使用的是5及以上的rails,则可以使用

实现相同的功能
str.parameterize(separator: '_')

答案 5 :(得分:6)

str.downcase.tr(" ", "_")

注意:没有“!”

答案 6 :(得分:2)

str = "Foo Bar"
str.tr(' ','').underscore

=> "foo_bar"

答案 7 :(得分:1)

你也可以这样做 str.gsub(“”,“_”)