如何用信用卡号PAN屏蔽所有带有“#”符号的字符最后四个字符?

问题描述

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

解决方法

string.gsub(/.(?=....)/,'*')
=> "*********1234" 

gsub(不含!)不会使string指向的原始对象发生变异,并且可以进行正则表达式论证。

.与一个不是换行符的字符匹配,并且?=是一个正向超前字符,因此超出该字符的四个字符(不是换行符)将被替换为第二个gsub参数,即*

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

产生相同的输出,使用\d查找数字,并使用[0-9]{4}进行正向超前搜索,该匹配将匹配介于零和九之间的四个字符。

,

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

如果您只是想掩盖信用卡号,可以采用多种方法。但是,使棘手的问题是信用卡号可以有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","###########2345"]

注意事项

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

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

如果要在掩码中保留间距,破折号等,则冒着以下风险:格式错误的字符串(例如"1234-5678-9012-34 5-6")会产生意外的结果,例如" 5-6"作为最后四位数字。通常最好将输入标准化,然后将选择的格式应用于输出(例如,使用printf或sprintf)。当然,您的特定用例可能会有所不同。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...