我一直在寻找一个只验证 MM/DD 的正则表达式。我不需要年份(我们在表格中询问财政年度结束,所以我们不需要年份,我们需要知道他们财政年度的范围)。
例如,我需要他们能够分别在 6 月 30 日或 12 月 31 日输入 06/30 或 12/31。我能找到的所有正则表达式示例都将年份作为日期的一部分,我不需要,而且我对正则表达式语法非常不熟悉。什么正则表达式只能用于两位数的月份和日期?
对于所有月份(即 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
您可以避免regex
使用类似的方法split
所以,你必须按照这些步骤
1>Split
字符串/
2>解析结果MM
和DD
integer
3>现在compare
解析整数以检查它是否是有效的月份或日期..
您需要的模式是:
#(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
我认为这可能有效
^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$
正则表达式不是正确的答案,请使用日期库来执行此验证。
话虽这么说,这里有一个正则表达式应该可以解决问题(这应该有助于说服你正则表达式不是正确的答案):
^(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])$