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

wuwx · April 04, 2013 · Last by ashchan replied at April 04, 2013 · 3455 hits

比如真实证件号码是: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"
You need to Sign in before reply, if you don't have an account, please Sign up first.