非数字字符的Gsub也会删除数字字符

时间:2014-01-28 19:25:16

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

代码:

puts "params[:phone] is " + params[:phone]
ph = params[:phone].gsub!(/\D/,'')
Rails.logger.info("ph is now " + ph + "\r\n")

Rails控制台:

params [:phone]是808XXXXXXX< - (删除隐私权) 在2383ms完成500内部服务器错误

TypeError(没有将nil隐式转换为String):   app / controllers / api_controller.rb:400:在`+'

这意味着'ph'是零。

WUT?

同样的gsub!(/ \ D /,'')部分已经工作了近一年,剥离了连字符,空格,括号等。

现在它想彻底剥离一切。

我不明白。

编辑:

当我使用它时:

ph = params[:phone].gsub(/\D/,'')

我得到了我期望的结果,有和没有数字(例如“8084445555”或“808-444-5555”我得到的结果“8084445555”)

但我仍然想知道原因。 GSUB!将取代params [:phone],我明白了,但它不应该剥离非数字,它就是。

1 个答案:

答案 0 :(得分:3)

以下是答案:

如果原始字符串与任何内容不匹配,

gsub将返回该字符串。另一方面,gsub!会在这种情况下返回nil

如果两个方法匹配,它们将返回包含替换的字符串,并且没有任何特殊之处,除了gsub!将修改接收器对象,因为您应该已经知道。

以下是一些说明事实的例子。特别注意主题和返回的值。如果需要,您可以在 irb 中尝试以下操作。

phone_number = "888-555-0110"              #=> "888-555-0110"
stripped_pn = phone_number.gsub(/\D/, '')  #=> "8885550110"
phone_number                               #=> "888-555-0110"
stripped_pn.gsub(/\D/, '')                 #=> "8885550110"

以下是与gsub!相同的示例:

phone_number = "888-555-0110"               #=> "888-555-0110"
stripped_pn = phone_number.gsub!(/\D/, '')  #=> "8885550110"
phone_number                                #=> "8885550110"
stripped_pn.gsub!(/\D/, '')                 #=> nil