[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

【挑战】利用批处理命令findstr判断输入日期的合法性

要求:
  编写纯批处理对输入的日期进行合法性判断

  必须用且只能用一次findstr进行判断,模式为echo %str%|findstr

      请对代码进行简要的说明,至少讲清楚你的思路


  合法性:

    1、输入为8个纯数字,如:20100529(yyyymmdd)

    2、年份为1000-3000年,允许对平闰年进行计算判断

    3、月份合理性判断

    4、日期合理性判断,特别注意对2月日期的判断
附截图如下:
全部合格少位数字
日期超出月份超出
日期超出年份超出
多位数字日期超出
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
***共同提高***

楼上是不是没看清楚题意,只有findstr就能判断出来啊,还要这么多代码做什么?
***共同提高***

TOP

4# abcdshenji
兄弟怎么说的话,大家都是学习者,不过这题能叫挑战,肯定不是这么简单,在findstr有限的正则上多想想。。。
***共同提高***

TOP

本帖最后由 batman 于 2011-5-30 08:51 编辑

6# caruko
全文只有一个findstr,正如题意所描述的。。。

带显示命令和pause命令这两行总共应在五行代码内吧。。。
***共同提高***

TOP

8# caruko
看到我的载图不,这不是做到了吗?呵呵。。。,当然肯定还有其他好办法的。。。
***共同提高***

TOP

本帖最后由 batman 于 2011-5-30 09:46 编辑

10# lxzzr
不是源自,是很相似,但这个情况肯定复杂得多。。。

ps:代码不要跑题哦。。。
***共同提高***

TOP

11# cjiabing

用且只用一次findstr命令不是很难懂吧。。。
***共同提高***

TOP

本帖最后由 batman 于 2011-5-30 11:12 编辑
应该是用到了多个模式串来处理不同月份不同天数的问题
只是平闰年判断尚没有不用set的思路

一般的检测日期的方法除了简单判断溢出之外
就是使用日期的命令来辅助检测了
date是最常用的比如10楼的方案
不过它有 ...
qzwqzw 发表于 2011-5-30 11:06

高人总是能一语中的。。。换句话来说:怎么变也难逃法眼

qzw我有个私人问题压积于心中很久,还望给予回复:你是不是就是willsort老大?(感觉不便可短信告之于我)
***共同提高***

TOP

19# caruko
请按题意附上简明思路,要知道看这个东东很头痛的。。。
***共同提高***

TOP

23# zm900612
继续跑题。。。。
***共同提高***

TOP

本帖最后由 batman 于 2011-5-30 19:52 编辑

期待qzw完整代码的出现,先贴出本人的愚解:
  1. @echo off
  2. :lp
  3. cls&set "flag="&set "str="
  4. set /p str=请输入:
  5. set /a "p=!(%str:~,4%%%4)&!(!(%str:~,4%%%100))|!(%str:~,4%%%400)+8">nul 2>nul
  6. 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=不"
  7. echo 这是%flag%合法的日期
  8. 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参数就可以实现了。

    个人测试没有发现问题,欢迎大家测试并批评指导。
***共同提高***

TOP

33# qzwqzw
两种模式的判断,好!

但楼上是特意不判断3000年的吗?
***共同提高***

TOP

35# qzwqzw
多谢提醒,已合并。。。

对于逆向的多项匹配确实是不能用/x和/v,一时也无好的思路。。。
***共同提高***

TOP

返回列表