使用 bash 验证信用卡号

使用 bash 验证信用卡号

我使用以下正则表达式来检测有效的卡号。

[2-6][0-9]{3}([ -]?)[0-9]{4}([ -]?)[0-9]{4}([ -]?)[0-9]{3,4}([ -]?)[0-9]{0,3}[^a-zA-Z]

但它没有检测到以下内容:

374355011240344
373116614411000

但如果我在网站中使用相同的内容:http://www.regexr.com/,所有这些都被检测到。

这有什么兼容性问题吗?

我想要的是检测任何模式:

  1. 从 2,3,4,5,6 开始
  2. 可以用“ ”或“-”以 4 位数字间隔分隔 (2345-3456-2345-2345 / 4567 6745 5645 4534 345)
  3. 长度可以是 13 到 19

这是我使用过的命令。

for i in * */*;
do
    grep -ocE "[2-6][0-9]{3}([ -]?)[0-9]{4}([ -]?)[0-9]{4}([ -]?)[0-9]{3,4}([ -]?)[0-9]{0,3}[^a-zA-Z]" "$i";
done    `

答案1

根据提供表达式的实用程序、调用命令时使用的参数、调用命令的 shell 等问题,正则表达式的评估方式存在差异和限制。

话虽如此,当我将正则表达式与 grep 一起使用时,正则表达式的最后一部分会阻止匹配;它没有列为可选,因此它超出了字符数(查找的不是字母)。

[{0} 01:49:15] $ echo "374355011240344" | grep -Eo "[2-6][0-9]{3}([ -]?)[0-9]{4}([ -]?)[0-9]{4}([ -]?)[0-9]{3,4}([ -]?)[0-9]{0,3}[^a-zA-Z]"                                                                                                                                                                                                                    
[{1} 01:49:33] $ echo "374355011240344" | grep -Eo "[2-6][0-9]{3}([ -]?)[0-9]{4}([ -]?)[0-9]{4}([ -]?)[0-9]{3,4}([ -]?)[0-9]{0,3}[^a-zA-Z]?"                                                                                        
374355011240344

以下网站编写了有关信用卡正则表达式的书:信用卡正则表达式

此正则表达式将匹配有效的 Visa、MC 和 Amex:

"^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13})$"

我提供的链接显示了如何“扩展”该正则表达式以覆盖所有主要 CC。他们的一般方法(我同意,因为它的价值)是在模式匹配之前去除无关的字符 - 删除空格、破折号等。这可能值得研究。

还有几个网站:

https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s20.html

http://reluctanthacker.rollett.org/creating-regex-finding-credit-card-numbers-grep

答案2

使用 luhn 算法可以更好地完成此操作,可以在此处找到有关如何在 bash 中实现它的讨论https://codereview.stackexchange.com/questions/95211/validating-a-credit-card-number-using-luhns-algorithm

相关内容