快速入门
教程
工具和语言
示例
参考
书评
示例
正则表达式示例
数字范围
浮点数
电子邮件地址
IP 地址
有效日期
数字日期转文本
信用卡号
匹配整行
删除重复行
编程
两个相邻单词
陷阱
灾难性回溯
重复过多
拒绝服务
将所有内容设为可选
重复捕获组
混合 Unicode 和 8 位
本网站上的更多内容
简介
正则表达式快速入门
正则表达式教程
替换字符串教程
应用程序和语言
正则表达式示例
正则表达式参考
替换字符串参考
书评
可打印 PDF
关于本网站
RSS Feed 和博客
RegexMagic—Generate regular expressions matching credit card numbers

查找或验证信用卡号

使用几个简单的正则表达式,您可以轻松验证客户是否在订单表单中输入了有效的信用卡号。您甚至可以确定所用信用卡的类型。每个发卡机构都有自己的卡号范围,由前 4 位数字标识。

您可以使用稍微不同的正则表达式来查找信用卡号或可能为信用卡号的数字序列,这些序列位于较大的文档中。这对于在安全审计中证明您没有不当公开客户的财务详细信息非常有用。

我们将从订单表单开始。

去除空格和破折号

第一步是从客户输入的卡号中删除所有非数字字符。实体信用卡在卡号中包含空格以对数字进行分组,从而使人类更容易阅读或输入。因此,您的订单表单应接受带有空格或破折号的卡号。

若要从卡号中删除所有非数字字符,只需在脚本语言中使用“全部替换”功能搜索正则表达式 [^0-9]+,并将其替换为空。如果您只想替换空格和破折号,可以使用 [ -]+。如果此正则表达式看起来很奇怪,请记住,在字符类中,当连字符出现在右括号之前(或在左括号或否定脱字符之后)时,它是一个文本字符。

如果您想知道加号的作用:这是为了提高性能。如果输入包含连续的非数字字符,例如 1===2,则 [^0-9]+ 一次匹配三个等号并在一处替换中将其删除。如果没有加号,则需要进行三次替换。在这种情况下,节省的时间只有几微秒。但是,将正则表达式效率记在心中是一个好习惯。尽管这里的节省很小,但输入额外加号的精力也很小。

验证订单表单中的信用卡号

验证信用卡号是正则表达式的理想工作。它们只是一系列 13 到 16 位数字,开头有几个特定数字来识别发卡机构。你可以使用以下特定正则表达式在客户尝试使用你不接受的卡种时向其发出警报,或使用不同的卡将订单路由到不同的处理器。所有这些正则表达式均取自 RegexBuddy 库

如果你只想检查卡号是否有效,而无需确定品牌,你可以使用 交替 将以上六个正则表达式组合起来。一个 非捕获组锚点 放在交替之外。自由间距 允许注释,并允许正则表达式适应此页面的宽度。

^(?:4[0-9]{12}(?:[0-9]{3})?          # Visa
 
|  (?:5[1-5][0-9]{2}                # MasterCard
     
| 222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}
 
|  3[47][0-9]{13}                   # American Express
 
|  3(?:0[0-5]|[68][0-9])[0-9]{11}   # Diners Club
 
|  6(?:011|5[0-9]{2})[0-9]{12}      # Discover
 
|  (?:2131|1800|35\d{3})\d{11}      # JCB
)$

这些正则表达式将轻松捕获无效的数字,因为客户输入的数字太多或太少。它们不会捕获数字错误的数字。为此,你需要遵循 Luhn 算法,这是无法通过正则表达式完成的。当然,即使数字在数学上有效,也并不意味着发行了带有此号码的卡或账户中有钱。正则表达式的优点是,你可以将其放入一段 JavaScript 中,以立即检查明显的错误,而不是让客户等待 30 秒,让你的信用卡处理器处理失败的订单。如果你的信用卡处理器对失败的交易收费,你真的需要同时实现正则表达式和 Luhn 验证。

在文档中查找信用卡号

通过两个简单的修改,你可以使用上述任何一个正则表达式在较大的文档中查找卡号。只需用 单词边界 替换 脱字符和美元,如 \b4[0-9]{12}(?:[0-9]{3})?\b

如果您计划搜索大型文档服务器,则更简单的正则表达式将加快搜索速度。除非您的公司出于其他目的使用 16 位数字,否则您将很少出现误报。正则表达式 \b\d{13,16}\b 将找到任何 13 到 16 位数字序列。

在搜索充满文件的硬盘时,您不能像验证单个卡号时那样先去掉空格和破折号。要查找带有空格或破折号的卡号,请使用 \b(?:\d[ -]*?){13,16}\b。此正则表达式允许数字中的任何数量的空格和破折号。这确实是唯一的方法。Visa 和 MasterCard 将数字分成 4 组,而 Amex 和 Discover 使用 4、5 和 6 位数字的组。输入数字的人可能还有不同的想法。