本帖最后由 batman 于 2011-5-30 19:52 编辑
期待qzw完整代码的出现,先贴出本人的愚解:- @echo off
- :lp
- cls&set "flag="&set "str="
- set /p str=请输入:
- set /a "p=!(%str:~,4%%%4)&!(!(%str:~,4%%%100))|!(%str:~,4%%%400)+8">nul 2>nul
- echo %str%|findstr /x "[1-2][0-9][0-9][0-9]0[1-9]0[1-9] [1-2][0-9][0-9][0-9]1[0-2]0[1-9] [1-2][0-9][0-9][0-9]0[1-9]1[0-9] [1-2][0-9][0-9][0-9]1[0-2][1-2][0-9] [1-2][0-9][0-9][0-9]0[13456789]2[0-9] [1-2][0-9][0-9][0-9]022[0-%p%] [1-2][0-9][0-9][0-9]0[13578]3[0-1] [1-2][0-9][0-9][0-9]0[469]30 [1-2][0-9][0-9][0-9]1[02]3[0-1] [1-2][0-9][0-9][0-9]1130 30000[1-9]0[1-9] 30001[0-2]0[1-9] 30000[1-9]1[0-9] 30001[0-2][1-2][0-9] 30000[13456789]2[0-9] 3000022[0-%p%] 30000[13578]3[0-1] 30000[469]30 30001[02]3[0-1] 30001130">nul||set "flag=不"
- echo 这是%flag%合法的日期
- pause>nul&goto lp
复制代码 简要说明下思路如下:
整体为正向匹配法,就是列出所有合法日期的组合。正则表达式本来就很长了,如果再加入对平闰年的组合,表达式将更长,所以在前面对平闰年进行了计算并设置了针对二月的日期变量。
随后在正则中先将合法年份的判断分为两个部分,第一部分的正则是[1-2][0-9][0-9][0-9],第二部分的正则就是3000;然后再这两种情况下分别组合日期为[0]1-9,[1-2][0-9],3[0-1]的情况,并在其中加入对月份合法的正则判断以及各月份最大天数值的正则判断,重点对2月进行了判断,正则为022[0-%p%],具体的分项为[1-2][0-9][0-9][0-9]022[0-%p%]和3000022[0-%p%]。其中p值为set/a计算出来的,平年为8,闰年为9。
至于字符串合法性判断,以及长度判断用一个/x参数就可以实现了。
个人测试没有发现问题,欢迎大家测试并批评指导。 |