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"

-完-

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

相关文章:

你感兴趣的文章:

标签云: