如何解决如何用信用卡号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)。当然,您的特定用例可能会有所不同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。