正则表达式以匹配信用卡到期日期

时间:2013-12-06 17:52:26

标签: regex

我有以下模式,我试图用它来匹配信用卡到期日期:

(0[1-9]|1[0-2])\/?(([0-9]{4})|[0-9]{2}$)

我正在测试以下字符串:

02/13
0213
022013
02/2013
02/203
02/2
02/20322

它应该只匹配前四个字符串,而后三个字符串不应该匹配,因为它们无效。但是,当前模式也匹配最后一个字符串。我做错了什么?

3 个答案:

答案 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/;

工作演示:http://regex101.com/r/gN5wH2

答案 1 :(得分:1)

移动右翼:

^(0[1-9]|1[0-2])\/?(([0-9]{4}|[0-9]{2})$)

结束锚未应用于[0-9] {4}选项,因此允许使用更多数字。

答案 2 :(得分:1)

由于我们正在谈论信用卡到期日期,一旦您在其他答案中使用其中一个优秀的正则表达式表达式验证了输入日期字符串,肯定会确认日期不是过去

这样做:

  1. 将输入日期字符串表示为YYYYMM。例如: 201409
  2. 对当前日期执行相同操作。例如: 201312
  3. 然后只需compare the date strings lexicographically:例如: 201409 ge 201312
  4. 在Perl中,gegreater than or equal to字符串比较运算符。请注意,建议@Dan Cowell,信用卡通常在到期月的最后一天到期,因此使用gt(大于)运营商是不合适的。

    或者,如果您的语言不支持以这种方式比较字符串,请将两个字符串转换为整数,然后进行算术比较。