MM/YY格式银行卡有效期正则验证问题:YY需覆盖19-99
解决银行卡有效期YY部分的正则问题
嘿,我一眼就看出你原正则的问题所在了——主要是分组逻辑错误和YY范围的写法不对,才导致出现只认19、还允许三位数字的bug。
原正则的问题拆解
你写的^(0[1-9]|10|11|12)/1[9]|2[0-9]{2}$里,|的位置完全错了:它把整个表达式拆成了两个独立的分支:
- 第一个分支:
^(0[1-9]|10|11|12)/1[9]→ 只能匹配MM/19这种格式 - 第二个分支:
2[0-9]{2}$→ 甚至不需要前面的MM,直接匹配2xx这种三位数字,完全脱离了银行卡有效期的格式要求
而且你想匹配19-99的两位YY,却写成了1[9]|2[0-9]{2},既把19限定死,又允许了三位数字,完全不符合需求。
修改后的正确正则
^(0[1-9]|1[0-2])/(19|[2-9]\d)$
如果你更习惯把MM的10/11/12单独列出来,也可以写成:
^(0[1-9]|10|11|12)/(19|[2-9]\d)$
正则各部分解释
- MM部分:
0[1-9]匹配01-09,1[0-2](或10|11|12)匹配10-12,合起来严格限制MM为01-12,和你原来的逻辑一致。 - YY部分:
19直接匹配最低有效值19[2-9]\d匹配20-99(第一位是2-9,第二位是0-9的任意数字)
两者用|包裹,确保YY只能是19-99之间的两位数字
- 首尾锚点:
^和$确保整个输入只能是MM/YY的格式,不允许任何多余的前置/后置字符,彻底解决了输入超过两位数字还能匹配的问题。
验证案例
✅ 有效输入:01/19、12/99、05/23、09/50
❌ 无效输入:00/19(MM非法)、13/20(MM非法)、01/18(YY小于19)、01/05(YY小于19)、01/100(YY三位)、01/9(YY一位)
内容的提问来源于stack exchange,提问作者Leo Messi




