我使用以下正则表达式来检测有效的卡号。
[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/,所有这些都被检测到。
这有什么兼容性问题吗?
我想要的是检测任何模式:
- 从 2,3,4,5,6 开始
- 可以用“ ”或“-”以 4 位数字间隔分隔 (2345-3456-2345-2345 / 4567 6745 5645 4534 345)
- 长度可以是 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。他们的一般方法(我同意,因为它的价值)是在模式匹配之前去除无关的字符 - 删除空格、破折号等。这可能值得研究。
还有几个网站:
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