4

我一直在寻找一个验证 MM/DD 的正则表达式。我不需要年份(我们在表格中询问财政年度结束,所以我们不需要年份,我们需要知道他们财政年度的范围)。

例如,我需要他们能够分别在 6 月 30 日或 12 月 31 日输入 06/30 或 12/31。我能找到的所有正则表达式示例都将年份作为日期的一部分,我不需要,而且我对正则表达式语法非常不熟悉。什么正则表达式只能用于两位数的月份和日期?

4

5 回答 5

11

对于所有月份(即 28 天):

(0[1-9]|1[0-2])/([01][1-9]|10|2[0-8])

除二月外的所有月份:

(0[13-9]|1[0-2])/(29|30)

对于 31 天的月份(即 01、03、05、07、08、10 和 12)

(0[13578]|1[0-2])/31

把这个放在一起

((0[1-9]|1[0-2])/([01][1-9]|10|2[0-8]))|((0[13-9]|1[0-2])/(29|30))|((0[13578]|1[0-2])/31)

然后对于闰年将以下内容附加到正则表达式

|02/29
于 2012-12-06T19:59:04.627 回答
3

您可以避免regex使用类似的方法split

所以,你必须按照这些步骤

1>Split字符串/

2>解析结果MMDDinteger

3>现在compare解析整数以检查它是否是有效的月份或日期..

于 2012-12-06T19:46:55.547 回答
3

您需要的模式是:

#(0[13578]|1[02])/(0[1-9]|[12][0-9]|3[01])|(0[469]|11)/(0[1-9]|[12][0-9]|30)|02/(0[1-9]|[12][0-9])#

在 PHP 中测试它:

<?

$p = '#' . implode('|', array(
    '(0[13578]|1[02])/(0[1-9]|[12][0-9]|3[01])', // 31-day months
    '(0[469]|11)/(0[1-9]|[12][0-9]|30)', // 30-day months
    '02/(0[1-9]|[12][0-9])', // February
)) . '#';

for ($m = 0; $m < 14; $m++) {
    for ($d = 0; $d < 33; $d++) {
        $date = sprintf('%02d/%02d', $m, $d);
        echo $date . ' - ' . preg_match($p, $date) . "\n";
    }
    echo "\n";
}

结果是:

00/00 - 0
00/01 - 0
00/02 - 0
00/03 - 0
00/04 - 0
00/05 - 0
00/06 - 0
00/07 - 0
00/08 - 0
00/09 - 0
00/10 - 0
00/11 - 0
00/12 - 0
00/13 - 0
00/14 - 0
00/15 - 0
00/16 - 0
00/17 - 0
00/18 - 0
00/19 - 0
00/20 - 0
00/21 - 0
00/22 - 0
00/23 - 0
00/24 - 0
00/25 - 0
00/26 - 0
00/27 - 0
00/28 - 0
00/29 - 0
00/30 - 0
00/31 - 0
00/32 - 0

01/00 - 0
01/01 - 1
01/02 - 1
01/03 - 1
01/04 - 1
01/05 - 1
01/06 - 1
01/07 - 1
01/08 - 1
01/09 - 1
01/10 - 1
01/11 - 1
01/12 - 1
01/13 - 1
01/14 - 1
01/15 - 1
01/16 - 1
01/17 - 1
01/18 - 1
01/19 - 1
01/20 - 1
01/21 - 1
01/22 - 1
01/23 - 1
01/24 - 1
01/25 - 1
01/26 - 1
01/27 - 1
01/28 - 1
01/29 - 1
01/30 - 1
01/31 - 1
01/32 - 0

02/00 - 0
02/01 - 1
02/02 - 1
02/03 - 1
02/04 - 1
02/05 - 1
02/06 - 1
02/07 - 1
02/08 - 1
02/09 - 1
02/10 - 1
02/11 - 1
02/12 - 1
02/13 - 1
02/14 - 1
02/15 - 1
02/16 - 1
02/17 - 1
02/18 - 1
02/19 - 1
02/20 - 1
02/21 - 1
02/22 - 1
02/23 - 1
02/24 - 1
02/25 - 1
02/26 - 1
02/27 - 1
02/28 - 1
02/29 - 1
02/30 - 0
02/31 - 0
02/32 - 0

03/00 - 0
03/01 - 1
03/02 - 1
03/03 - 1
03/04 - 1
03/05 - 1
03/06 - 1
03/07 - 1
03/08 - 1
03/09 - 1
03/10 - 1
03/11 - 1
03/12 - 1
03/13 - 1
03/14 - 1
03/15 - 1
03/16 - 1
03/17 - 1
03/18 - 1
03/19 - 1
03/20 - 1
03/21 - 1
03/22 - 1
03/23 - 1
03/24 - 1
03/25 - 1
03/26 - 1
03/27 - 1
03/28 - 1
03/29 - 1
03/30 - 1
03/31 - 1
03/32 - 0

04/00 - 0
04/01 - 1
04/02 - 1
04/03 - 1
04/04 - 1
04/05 - 1
04/06 - 1
04/07 - 1
04/08 - 1
04/09 - 1
04/10 - 1
04/11 - 1
04/12 - 1
04/13 - 1
04/14 - 1
04/15 - 1
04/16 - 1
04/17 - 1
04/18 - 1
04/19 - 1
04/20 - 1
04/21 - 1
04/22 - 1
04/23 - 1
04/24 - 1
04/25 - 1
04/26 - 1
04/27 - 1
04/28 - 1
04/29 - 1
04/30 - 1
04/31 - 0
04/32 - 0

05/00 - 0
05/01 - 1
05/02 - 1
05/03 - 1
05/04 - 1
05/05 - 1
05/06 - 1
05/07 - 1
05/08 - 1
05/09 - 1
05/10 - 1
05/11 - 1
05/12 - 1
05/13 - 1
05/14 - 1
05/15 - 1
05/16 - 1
05/17 - 1
05/18 - 1
05/19 - 1
05/20 - 1
05/21 - 1
05/22 - 1
05/23 - 1
05/24 - 1
05/25 - 1
05/26 - 1
05/27 - 1
05/28 - 1
05/29 - 1
05/30 - 1
05/31 - 1
05/32 - 0

06/00 - 0
06/01 - 1
06/02 - 1
06/03 - 1
06/04 - 1
06/05 - 1
06/06 - 1
06/07 - 1
06/08 - 1
06/09 - 1
06/10 - 1
06/11 - 1
06/12 - 1
06/13 - 1
06/14 - 1
06/15 - 1
06/16 - 1
06/17 - 1
06/18 - 1
06/19 - 1
06/20 - 1
06/21 - 1
06/22 - 1
06/23 - 1
06/24 - 1
06/25 - 1
06/26 - 1
06/27 - 1
06/28 - 1
06/29 - 1
06/30 - 1
06/31 - 0
06/32 - 0

07/00 - 0
07/01 - 1
07/02 - 1
07/03 - 1
07/04 - 1
07/05 - 1
07/06 - 1
07/07 - 1
07/08 - 1
07/09 - 1
07/10 - 1
07/11 - 1
07/12 - 1
07/13 - 1
07/14 - 1
07/15 - 1
07/16 - 1
07/17 - 1
07/18 - 1
07/19 - 1
07/20 - 1
07/21 - 1
07/22 - 1
07/23 - 1
07/24 - 1
07/25 - 1
07/26 - 1
07/27 - 1
07/28 - 1
07/29 - 1
07/30 - 1
07/31 - 1
07/32 - 0

08/00 - 0
08/01 - 1
08/02 - 1
08/03 - 1
08/04 - 1
08/05 - 1
08/06 - 1
08/07 - 1
08/08 - 1
08/09 - 1
08/10 - 1
08/11 - 1
08/12 - 1
08/13 - 1
08/14 - 1
08/15 - 1
08/16 - 1
08/17 - 1
08/18 - 1
08/19 - 1
08/20 - 1
08/21 - 1
08/22 - 1
08/23 - 1
08/24 - 1
08/25 - 1
08/26 - 1
08/27 - 1
08/28 - 1
08/29 - 1
08/30 - 1
08/31 - 1
08/32 - 0

09/00 - 0
09/01 - 1
09/02 - 1
09/03 - 1
09/04 - 1
09/05 - 1
09/06 - 1
09/07 - 1
09/08 - 1
09/09 - 1
09/10 - 1
09/11 - 1
09/12 - 1
09/13 - 1
09/14 - 1
09/15 - 1
09/16 - 1
09/17 - 1
09/18 - 1
09/19 - 1
09/20 - 1
09/21 - 1
09/22 - 1
09/23 - 1
09/24 - 1
09/25 - 1
09/26 - 1
09/27 - 1
09/28 - 1
09/29 - 1
09/30 - 1
09/31 - 0
09/32 - 0

10/00 - 0
10/01 - 1
10/02 - 1
10/03 - 1
10/04 - 1
10/05 - 1
10/06 - 1
10/07 - 1
10/08 - 1
10/09 - 1
10/10 - 1
10/11 - 1
10/12 - 1
10/13 - 1
10/14 - 1
10/15 - 1
10/16 - 1
10/17 - 1
10/18 - 1
10/19 - 1
10/20 - 1
10/21 - 1
10/22 - 1
10/23 - 1
10/24 - 1
10/25 - 1
10/26 - 1
10/27 - 1
10/28 - 1
10/29 - 1
10/30 - 1
10/31 - 1
10/32 - 0

11/00 - 0
11/01 - 1
11/02 - 1
11/03 - 1
11/04 - 1
11/05 - 1
11/06 - 1
11/07 - 1
11/08 - 1
11/09 - 1
11/10 - 1
11/11 - 1
11/12 - 1
11/13 - 1
11/14 - 1
11/15 - 1
11/16 - 1
11/17 - 1
11/18 - 1
11/19 - 1
11/20 - 1
11/21 - 1
11/22 - 1
11/23 - 1
11/24 - 1
11/25 - 1
11/26 - 1
11/27 - 1
11/28 - 1
11/29 - 1
11/30 - 1
11/31 - 0
11/32 - 0

12/00 - 0
12/01 - 1
12/02 - 1
12/03 - 1
12/04 - 1
12/05 - 1
12/06 - 1
12/07 - 1
12/08 - 1
12/09 - 1
12/10 - 1
12/11 - 1
12/12 - 1
12/13 - 1
12/14 - 1
12/15 - 1
12/16 - 1
12/17 - 1
12/18 - 1
12/19 - 1
12/20 - 1
12/21 - 1
12/22 - 1
12/23 - 1
12/24 - 1
12/25 - 1
12/26 - 1
12/27 - 1
12/28 - 1
12/29 - 1
12/30 - 1
12/31 - 1
12/32 - 0

13/00 - 0
13/01 - 0
13/02 - 0
13/03 - 0
13/04 - 0
13/05 - 0
13/06 - 0
13/07 - 0
13/08 - 0
13/09 - 0
13/10 - 0
13/11 - 0
13/12 - 0
13/13 - 0
13/14 - 0
13/15 - 0
13/16 - 0
13/17 - 0
13/18 - 0
13/19 - 0
13/20 - 0
13/21 - 0
13/22 - 0
13/23 - 0
13/24 - 0
13/25 - 0
13/26 - 0
13/27 - 0
13/28 - 0
13/29 - 0
13/30 - 0
13/31 - 0
13/32 - 0
于 2012-12-06T21:24:38.467 回答
0

我认为这可能有效

^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$
于 2012-12-06T19:46:18.007 回答
0

正则表达式不是正确的答案,请使用日期库来执行此验证。

话虽这么说,这里有一个正则表达式应该可以解决问题(这应该有助于说服你正则表达式不是正确的答案):

^(0[13578]|1[02])/([012]\d|3[01])|(0[469]|11)/([012]\d|30)|02/[012]\d$

如果您只需要不检查一个月中的天数的简单验证,则可以使用以下方法:

^(0[1-9]|1[012])/([012]\d|3[01])$
于 2012-12-06T19:52:18.643 回答