为保证隐私把电话号码做星号替换,这种需求比较简单,一般用正则替换就可以了,但是在使用ruby实现这个需求的过程中发现一个小bug,见下面代码
irb(main):001:0> phone = "15555555555"
=> "15555555555"
irb(main):002:0> phone.sub(/(\d{3})\d{4}(\d{4})/,"#{$1}****#{$2}")
=> "****"
irb(main):003:0> phone.sub(/(\d{3})\d{4}(\d{4})/,"#{$1}****#{$2}")
=> "155****5555"
irb(main):004:0> phone = "13333333333"
=> "13333333333"
irb(main):005:0> phone.sub(/(\d{3})\d{4}(\d{4})/,"#{$1}****#{$2}")
=> "155****5555"
irb(main):006:0> phone.sub(/(\d{3})\d{4}(\d{4})/,"#{$1}****#{$2}")
=> "133****3333"
通过上面的代码可以看出第一次执行sub函数的时候,不会替换成功,执行一次以后才会生成$1
以及$2
全局变量,更换phone值后继续执行执行sub,发现$1
与$2
变量没有变化,执行一直滞后一步,后来在@blackanger指点下,找到了问题所在,避免这样的问题可以直接使用block代码块,确保第一次执行时候$1
与$2
已经生成,这样就可以保证替换工作得顺利进行。
irb(main):012:0> phone = "13333333344"
=> "13333333344"
irb(main):013:0> phone.sub(/(\d{3})\d{4}(\d{4})/){"#{$1}****#{$2}"}
=> "133****3344"
-完-