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

rug*_*ert 66 ruby ruby-on-rails ruby-on-rails-3

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

str.downcase.tr!(" ", "_")
Run Code Online (Sandbox Code Playgroud)

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

所以"新学校"会变成"new_school",但"颜色"会变成"",什么都没有!

Sam*_*dhe 98

与空间

str = "New School"
str.parameterize.underscore

=> "new_school"
Run Code Online (Sandbox Code Playgroud)

没有空间

str = "school"
str.parameterize.underscore

=> "school"
Run Code Online (Sandbox Code Playgroud)

编辑: - 我们也可以将'_'作为参数传递给参数化.

与空间

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

=> "new_school"
Run Code Online (Sandbox Code Playgroud)

没有空间

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

=> "school"
Run Code Online (Sandbox Code Playgroud)

  • 小心.`parameterize`将转换多个空格 - 许多特殊字符也将被转换.`parameterize`的目的是使字符串URL友好. (4认同)
  • 而参数化不再需要参数. (4认同)
  • 要小心,因为Ruby中没有`String#parameterize`.但是在Rails中有`String#parameterize`. (3认同)
  • 在 Rails 5 上,使用 str.parameterize(separator: '_')`。 (2认同)

rwi*_*ams 38

tr的文档!

__PRE__

如果你在没有感叹号的情况下使用tr,我想你会得到正确的结果.


Zac*_* Xu 36

如果您对以蛇形式获取字符串感兴趣,那么建议的解决方案不太有用,因为您可能会得到连接的下划线和开始/尾随下划线.

例如

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

以下解决方案可以更好地工作:

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

squish是Rails提供的String方法

  • 我认为```str.downcase.split.join('_')```如果#squish不可用也可以工作;) (2认同)

the*_*guy 11

如果您使用的是5号及以上的导轨,则可以实现相同的功能

str.parameterize(separator: '_')
Run Code Online (Sandbox Code Playgroud)


br3*_*3nt 8

老问题,但......

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

"hey\t there   world".gsub(/\s+/, '_') # hey_there_world
Run Code Online (Sandbox Code Playgroud)

这会获得制表符和新行以及空格并替换为单个行_.

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

"hey\t there   world".gsub(/\s/, '_') # hey__there___world
Run Code Online (Sandbox Code Playgroud)


Mic*_*ant 6

str.downcase.tr(" ", "_")
Run Code Online (Sandbox Code Playgroud)

注意:没有"!"