Regex 与信用卡到期日期匹配的正则表达式

Regex 与信用卡到期日期匹配的正则表达式,regex,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 它应该只匹配前四个字符串,后三个字符串不应该匹配,因为它们是无效的。但是,当前模式也与最后一个字符串匹配。我做错了什么?您缺少线锚的开头^,括号不匹配 这应该起作用: re = /^(0[1-9]|1[0-2])\/?([0-9]{4}|[0-9]{2}

我尝试使用以下模式来匹配信用卡到期日期:

(0[1-9]|1[0-2])\/?(([0-9]{4})|[0-9]{2}$)
我正在测试以下字符串:

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

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

您缺少线锚的开头
^
,括号不匹配

这应该起作用:

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/;
工作演示:右移巴拉那:

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

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

因为我们讨论的是信用卡到期日期,一旦您使用其他答案中的一个fineregex表达式验证了输入日期字符串,您肯定要确认日期不是过去的

为此:

  • 将输入的日期字符串表示为
    YYYYMM
    。例如:
    201409
  • 对当前日期执行相同的操作。例如:
    201312
  • 然后简单地说:例如:
    201409 ge 201312
  • 在Perl中,
    ge
    是字符串比较运算符。请注意,如前所述,信用卡通常在到期月份的最后一天到期,因此使用
    gt
    (大于)运营商是不合适的


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

    也许我有点困惑,但您确定括号中的
    [0-9]{4}是否正确
    area?@BlackPlanet我对正则表达式不熟悉-括号有什么问题吗?@moby请看下面我的答案。他/她可能不想在他/她的正则表达式中使用起始锚。疯了!为什么主播改变了事情?@BlackPlanet:看工作演示并在那里玩regex。我创建了一个演示,让您更好地理解颜色编码:基本上是可选的
    /
    使其与最后4位数字匹配,而无需锚定
    ^
    啊,这很微妙。另一方面,该测试仪令人惊讶。它仍然匹配最后一个字符串。我看到它匹配最后一个字符串的结尾(不是全部)。添加线锚的起点以修复该问题。请参见编辑。