【问题标题】:How can I mask everything but the last four characters of a credit card number (PAN) with "#" symbols? [duplicate]除了信用卡号 (PAN) 的最后四个字符之外,如何使用“#”符号来屏蔽所有内容? [复制]
【发布时间】:2020-08-28 20:55:38
【问题描述】:

我有一个信用卡号,例如 1234567891234,我只想显示此字符串的最后 4 个字符,例如 #########1234。我该怎么做?

【问题讨论】:

  • 虽然这看起来因为 OP 没有包含任何示例代码而吸引了反对票,但我认为这个问题已经足够清楚(并且足够广泛有用),它并不真正值得关闭或激进否决票。 YMMV。
  • 您好 Ozan,尝试编辑您的问题以包含您到目前为止所获得的内容。或者你认为你可能会如何去做。您会发现,当人们看到您的问题所在而不是为您提供整个程序时,他们更有可能提供帮助。

标签: ruby string data-masking


【解决方案1】:
string.gsub(/.(?=....)/, '*')
=> "*********1234" 

没有!gsub 不会改变string 指向的原始对象,并且可以接受正则表达式参数。

. 匹配不是换行符的字符,?= 是正向前瞻,因此任何超出它的四个字符(不是换行符)的字符都将替换为第二个 gsub参数,即*

string.gsub(/\d(?=[0-9]{4})/, '*')
=> "*********1234" 

产生相同的输出,使用\d 查找数字并使用[0-9]{4} 进行正向前瞻,匹配0 到9 之间的四个字符。

【讨论】:

    【解决方案2】:

    屏蔽除最后四位以外的所有数字

    如果您只是想掩盖信用卡号,有多种方法可以做到这一点。然而,潜在的棘手之处在于信用卡号可以有 13-19 位数字,尽管 16 位肯定是最常见的。

    解决此预期变化的最简单方法之一是使用String#slice! 保存最后四位数字,然后使用String#tr 将其余数字转换为掩码字符。例如:

    def mask_credit_card card_number
      credit_card_number = String(card_number).scan(/\d/).join
      last_four_digits   = credit_card_number.slice! -4..-1
      credit_card_number.tr("0-9", "#") << last_four_digits
    end
    
    # Test against various lengths & formats.
    [
      "1234567890123456",
      "1234-5678-9012-3456",
      1234567890123456,
      "1234-567890-12345",
    ].map { |card_number| mask_credit_card card_number }
    #=> ["############3456", "############3456", "############3456", "###########2345"]
    

    注意事项和注意事项

    像 Diners Club 这样的一些卡可以从零开始,这使得卡号不适合作为整数处理。将卡号视为字符串可能更可靠,但会迫使您考虑如何处理意外字符或空格。

    在对未经处理的输入调用掩码时,使用 #scan 提取数字比使用 #delete 更安全。例如,String(card_number).delete "-\s\t" 将规范化上面的示例数据,但可能无法捕获其他意外字符。永远不要相信用户输入!

    如果您想在掩码中保留空格、破折号等,您将面临格式错误的字符串(例如 "1234-5678-9012-34 5-6")会产生意外结果的风险,例如 " 5-6" 作为最后四位数字。通常最好对您的输入进行规范化,并将您选择的格式应用于您的输出(例如使用 printf 或 sprintf)。当然,您的具体用例可能会有所不同。

    【讨论】:

      猜你喜欢
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 2020-02-10
      • 1970-01-01
      • 2013-01-23
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多