正则表达式仅能初步验证信用卡号码格式(长度、数字组成、分组),无法真正校验有效性;真实有效性必须依赖luhn算法,即从右向左偶数位×2(≥10则减9),所有位和能被10整除才有效。

正则表达式可以初步验证信用卡号码的格式(长度、数字组成、分组可选),但不能真正校验卡号是否真实有效。真正的有效性依赖Luhn算法(模10校验),正则仅做前端快速过滤。
匹配主流卡号的基本格式
多数信用卡为13–19位纯数字,常见长度:Visa(13/16/19)、MasterCard(16)、Amex(15)、Discover(16)。可统一用长度范围+全数字验证:
- ^\d{13,19}$ —— 最简形式,只检查是否为13到19位数字
- 实际中常允许空格或连字符分隔(如
4532-1234-5678-9012或4532 1234 5678 9012),可扩展为:
^[\d\s\-]{13,19}$,再配合预处理(移除空格和短横)后校验纯数字长度
区分卡组织前缀(粗略识别)
不同卡组织有固定BIN(银行识别号)前缀,可用正则做初步判断(注意:BIN范围会更新,仅作参考):
- Visa:^4\d{12}(\d{3})?$(以4开头,总长13/16/19)
- MasterCard:^5[1-5]\d{14}$ 或 ^2(?:2(?:2[1-9]|[3-9]\d)|[3-6]\d\d|7(?:[01]\d|20))\d{12}$(新版含2221–2720等)
- American Express:^3[47]\d{13}$(15位,以34或37开头)
- Discover:^6(?:011|5\d)\d{12}$(16位,以6011、65开头)
必须配合Luhn算法才能可靠验证
正则无法发现输入错误(如单数字错、换位错误)。例如 4532123456789012 和 4532123456789013 都能通过长度和数字检查,但后者Luhn校验失败。
- Luhn步骤:从右向左,偶数位数字×2(若≥10则减9),所有位相加,结果能被10整除即有效
- 建议在正则初筛后,用代码实现Luhn校验(JavaScript、Python等均有成熟函数)
- 前端可用正则快速拦截明显非法输入(如含字母、过短),后端必须执行Luhn
实际使用建议
- 用户输入时,用 ^\d{4}[\s\-]?\d{4}[\s\-]?\d{4}[\s\-]?\d{4}$ 匹配常见4-4-4-4格式(16位),提升体验
- 提交前统一清理非数字字符:
cardNumber.replace(/[\s\-]/g, ''),再校验长度和Luhn - 不要依赖正则识别卡类型用于支付路由——应调用支付网关API或BIN数据库
- 避免过度复杂正则(如强行匹配所有BIN),维护成本高且易出错











