我试图解决一个问题,我输入的人的名字,他的信用卡号码。它必须识别出卡是哪一家公司的,并且除了最后四位以外,还必须隐藏数字的数字。例如,下面的行
'Preston: 345678901234567'
'601234123456737 is a Discover card'会变到
'Preston: ....4567'
'....6737 is a Discover card'到目前为止,我已经完成了如何使用http://www.regular-expressions.info/creditcard.html验证对信用卡公司的输入。
American Express: ^3[47][0-9]{13}$
Discover: ^6(?:011|5[0-9]{2})[0-9]{12}$
MasterCard: ^(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}$
Visa: ^4[0-9]{12}(?:[0-9]{3})?$除了最后四位数字之外,我不知道如何掩蔽其余的数字,并且没有太多的文章和资源可供帮助。
发布于 2020-06-10 18:43:18
下面的代码演示了如何在所有数字上屏蔽CC号码,但最后四位除外。
expression
F 213
use strict;
use warnings;
use feature 'say';
my %re_cc = (
'American Express' => qr/^3[47][0-9]{13}$/,
'Discover' => qr/^6(?:011|5[0-9]{2})[0-9]{12}$/,
'MasterCard' => qr/^(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}$/,
'Visa' => qr/^4[0-9]{12}(?:[0-9]{3})?$/
);
while( my $record = <DATA> ) {
chomp $record;
my( $name, $number ) = split ' ', $record;
while( my ($cc_name,$cc_regex) = each %re_cc ) {
if( $number =~ /$cc_regex/ ) {
$number =~ s/(\d+)(?=\d{4})/'*' x length($1)/e;
say "$name\t$number\n$number is a $cc_name";
last;
}
}
}
__DATA__
Preston 345678901234567输出
Preston ***********4567
***********4567 is a American Expresshttps://stackoverflow.com/questions/62304515
复制相似问题