lazybios

ruby正则替换(sub)中的一个坑

为保证隐私把电话号码做星号替换,这种需求比较简单,一般用正则替换就可以了,但是在使用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"

-完-

微信关注「日拱一卒」公众号