Ruby 大家给证件号打马赛克有什么好的代码写法么?

wuwx · 2013年04月04日 · 最后由 ashchan 回复于 2013年04月04日 · 3462 次阅读

比如真实证件号码是:100100199010100001 也有可能是 15 位的:100100901010001 打完马赛克之后是:100100XXXXXXXX0001 上网找了一种写法是:number.sub(number[6, 8], "XXXXXXXX") 不过这个方法偶尔可能会有 BUG……

irb(main):001:0> number = "12345678901234567890"
=> "12345678901234567890"
irb(main):002:0> number[10, 2]
=> "12"
irb(main):003:0> number.sub(number[10, 2], "XX")
=> "XX345678901234567890"
irb(main):004:0> 

大家有木有什么好写法呢?

丑陋无比的楼主要不要?

mosaiced = number mosaiced[6..13] = "XXXXXXXX"

number.gsub(/^(?<h>[\d]{6})([\d]*)(?<t>[\w]{4})$/, '\k<h>XXXXXXXX\k<t>')

这样?

#2 楼 @vkill 哇... 看不懂......

这个很简单。

module RangeMasker
  def mask(start, len, char = "X")
    masked = dup
    masked[start, len] = char * [len, masked.length - start].min
    masked
  end
end

number = "12345678901234567890"
number.extend RangeMasker
number.mask(10, 2) => "1234567890XX34567890"
需要 登录 后方可回复, 如果你还没有账号请 注册新账号