微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何用信用卡号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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?