我有以下模式,我试图用它来匹配信用卡到期日期:
(0[1-9]|1[0-2])\/?(([0-9]{4})|[0-9]{2}$)
我正在测试以下字符串:
02/13
0213
022013
02/2013
02/203
02/2
02/20322
它应该只匹配前四个字符串,而后三个字符串不应该匹配,因为它们无效。但是,当前模式也匹配最后一个字符串。我做错了什么?
答案 0 :(得分:23)
你错过了行锚^
的开头,而且括号是不匹配的。
这应该有效:
re = /^(0[1-9]|1[0-2])\/?([0-9]{4}|[0-9]{2})$/;
使用字边界:
re = /\b(0[1-9]|1[0-2])\/?([0-9]{4}|[0-9]{2})\b/;
答案 1 :(得分:1)
移动右翼:
^(0[1-9]|1[0-2])\/?(([0-9]{4}|[0-9]{2})$)
结束锚未应用于[0-9] {4}选项,因此允许使用更多数字。
答案 2 :(得分:1)
由于我们正在谈论信用卡到期日期,一旦您在其他答案中使用其中一个优秀的正则表达式表达式验证了输入日期字符串,肯定会确认日期不是过去。
这样做:
YYYYMM
。例如: 201409
201312
201409 ge 201312
。在Perl中,ge
是greater than or equal to字符串比较运算符。请注意,建议@Dan Cowell,信用卡通常在到期月的最后一天到期,因此使用gt
(大于)运营商是不合适的。
或者,如果您的语言不支持以这种方式比较字符串,请将两个字符串转换为整数,然后进行算术比较。