如何安全地用ruby下划线替换所有空格?


70

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

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

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

因此,“新学校”将变为“ new_school”,但“颜色”将为“”,什么都没有!


2
不要相信我的话,但我认为是str.gsub! /\s/, '_'

Answers:


41

tr的文档

使用与String#tr相同的规则翻译str。返回str;如果未进行任何更改,则返回nil。

我认为,如果您不带惊叹号使用tr,将会获得正确的结果。


确实,!更改了调用它的内容,而没有更改!则返回一个新字符串
erdostom 2015年

111

有空间

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"

编辑

对于Rails 5及更高版本,请使用 str.parameterize(separator: '_')


4
小心。parameterize转换的空间将超过空格-许多特殊字符也会被转换。目的parameterize是使字符串对URL友好。
马克·托马斯

4
小心,因为String#parameterizeRuby中没有。有String#parameterize在Rails的,虽然。
dskecse 2015年

4
并且参数化不再需要参数。
stephenmurdoch

1
在Rails 5上,使用str.parameterize(separator: '_')
BrunoFacca

37

如果您有兴趣获取蛇形字符串,那么建议的解决方案不太有效,因为您可能会得到串联的下划线和开始/结尾的下划线。

例如

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方法


4
str.downcase.split.join('_')如果#squish不可用,我认为这也可以工作;)
vidbina

14

如果您使用的是Rails 5和更高版本,则可以使用以下方法实现相同的目的

str.parameterize(separator: '_')


8

老问题,但是...

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

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

这将获得制表符和换行以及空格,并替换为一个_

可以修改正则表达式以满足您的需求。例如:

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

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

=> "foo_bar"

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.