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

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

[复制链接]
发表于 2011-5-30 10:59:56 | 显示全部楼层
这样的话,看来要用 /v 开关了。
我想想。
发表于 2011-5-30 11:06:42 | 显示全部楼层
应该是用到了多个模式串来处理不同月份不同天数的问题
只是平闰年判断尚没有不用set的思路

一般的检测日期的方法除了简单判断溢出之外
就是使用日期的命令来辅助检测了
date是最常用的比如10楼的方案
不过它有个缺陷就是可能会改变系统日期
即使只是短期的改变在某些环境下也是不允许的
即使允许也存在在日期临界点改变日期后恢复时可能存在错误

我现在常用的方法是net user
net user _ /expires:2004-02-29 2>&1|find "日期">nul&&echo 不合法的日期||echo 合法的日期

评分

参与人数 1技术 +1 收起 理由
zm900612 + 1 好!这个没想到

查看全部评分

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

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

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

qzw我有个私人问题压积于心中很久,还望给予回复:你是不是就是willsort老大?(感觉不便可短信告之于我)
发表于 2011-5-30 11:29:36 | 显示全部楼层
本帖最后由 caruko 于 2011-5-30 13:20 编辑

瑞年没有太精确。

就是把所有不合法的匹配串写进去,符合了就是不合法的。只是每个字串只匹配1-2个特征。
^[04-9]  指0000-0999  4000-9999年段。
^[3][1-9][1-9][1-9]  3111-3999好吧,这个其实不准确,没有包括3001-3099,要分成3个很麻烦。
^[0-9][0-9][0-9][0-9][2-9][0-9][0-9][0-9]$ ^[0-9][0-9][0-9][0-9][0-9][0-9][4-9][0-9]$ 指 月份不能是 20以上以及日期不能是40以上。
后面的分别对 13578,10,12 月限定 < 32, 469,11 <31 ,2月则根据年份最后一位是否02468,来决定是28还是29。
最后是限定 月份个位以及日期个位 <> 0

[^0-9]  去掉数字以外的字符,忘记了符号限定,修改一下。

呃,可以set计算的话,那么简单了。。
findstr判断了年份个位为13579的出现 0229为不合法,set 判断 02468后缀的年份情况。

  1. echo,%input%|findstr "^[04-9]  [^0-9]  ^[3][1-9][1-9][1-9][0-9]  ^[0-9][0-9][0-9][0-9][2-9][0-9][0-9][0-9]$ ^[0-9][0-9][0-9][0-9][0-9][0-9][4-9][0-9]$ ^[0-9][0-9][0-9][0-9][1][3-9][0-9][0-9] ^[0-9][0-9][0-9][0-9][0][469][3][1-9]$ ^[0-9][0-9][0-9][0-9][0][13578][3][2-9]$ ^[0-9][0-9][0-9][0-9][0][2][3-9][0-9]$ ^[0-9][0-9][0-9][13579][0][2][2][9]$ ^[0-9][0-9][0-9][0-9][1][02][3-9][2-9]$ ^[0-9][0-9][0-9][0-9][1][1][3-9][1-9]$ ^[0-9][0-9][0-9][0-9][0-9][0][0-9][0]$" >nul&& set input=10010229
  2. 2>nul set /a 1 / (%input:~0,4% %% 4) && (set /a 1 / (1%input:~4% - 10229)  && echo,合法 || echo,不合法 )  || echo,合法
复制代码

评分

参与人数 2PB +5 技术 +1 收起 理由
zm900612 + 1 难为你了,哈哈。
batman + 5 鼓励鼓励,请再修改 充分利用题意哦。。。

查看全部评分

发表于 2011-5-30 11:44:03 | 显示全部楼层
本帖最后由 caruko 于 2011-5-30 11:56 编辑

日期判断,其实 xcopy /d 也可以判断,日期无效会输出如“无效参数 - /d:02-29-2001” 。

  1. echo,f|xcopy "%0" a#b@c$.bat /d:02-29-2002 /l /u 2>&1|findstr "无效参数.*d:" >nul&& echo,不合法 ||echo 合法
复制代码
 楼主| 发表于 2011-5-30 11:44:16 | 显示全部楼层
19# caruko
请按题意附上简明思路,要知道看这个东东很头痛的。。。
发表于 2011-5-30 12:10:56 | 显示全部楼层
19# caruko
看见光明了!~
发表于 2011-5-30 12:28:13 | 显示全部楼层
10# lxzzr


哈哈,我也想到那块去了:
  1. @echo off
  2. set /p test=请输入日期
  3. xcopy>nul 2>nul /l /d:%test:~-4,2%-%test:~-2%-%test:0,-4% %tmp%&&echo 日期合法||echo 日期不合法
  4. pause
复制代码
 楼主| 发表于 2011-5-30 12:38:15 | 显示全部楼层
23# zm900612
继续跑题。。。。
发表于 2011-5-30 12:39:50 | 显示全部楼层
20# caruko


晕,看来又撞车了
发表于 2011-5-30 12:41:45 | 显示全部楼层
另外,如果只是用findstr判断平润年,还是可行的
发表于 2011-5-30 12:55:26 | 显示全部楼层
findstr 如何判断年份被被4整除呢?
发表于 2011-5-30 13:02:33 | 显示全部楼层
判断年份能被4整除很容易:
echo 20080102|findstr /e "[02468][048].... [13579][26]...."
若要同时对百位判断,只需要把这两条关键词排列组合成四条关键词就行了。
不过如果和日期放在一起排列组合,那...

评分

参与人数 1技术 +1 收起 理由
qzwqzw + 1 感谢提供闰年思路,只是不知是否原创?

查看全部评分

发表于 2011-5-30 15:50:22 | 显示全部楼层
按照合法日期的模式排列了组合一下findstr的模式串
不考虑闰年计算是10条
[1-2][0-9][0-9][0-9]0[1-9]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]0[^2]2[0-9]
[1-2][0-9][0-9][0-9]022[0-8]
[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[0-2]0[1-9]
[1-2][0-9][0-9][0-9]1[0-2][12][0-9]
[1-2][0-9][0-9][0-9]1[02]3[0-1]
[1-2][0-9][0-9][0-9]1130

如果考虑闰年计算
需要增补XXXX0229的模式串
仅考虑被4整除是2条
[1-2][0-9][02468][048]0229
[1-2][0-9][13579][26]0229
加起来一共是12条

考虑100,400整除的情况稍微复杂些
需要将00从[02468][048]中排除
即将之拆分成[2468][048]和[02468][48]
[1-2][0-9][13579][26]0229
[1-2][0-9][2468][048]0229
[1-2][0-9][02468][48]0229
[02468][048]000229
[13579][26]000229
加起来一共15条

这是正向过滤合法日期的模式串
反向过滤非法日期的模式串应该稍微简单些
只是还未想到过滤掉长度非法的模式串

评分

参与人数 1PB +6 收起 理由
zm900612 + 6 好思路!第一个想到反向排除

查看全部评分

发表于 2011-5-30 16:51:56 | 显示全部楼层
本帖最后由 caruko 于 2011-5-30 16:53 编辑

正向是符合任意一条都合法,而不是符合所有条件才合法。
逻辑上不对,所以不好用,加 /V 开关也不行。
反向过滤规则串更多。
包括 长度非法,非法非数字字符 等规则。

长度非法 直接 ^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$  或者 \<str>\ 也可以。

评分

参与人数 1PB +6 收起 理由
zm900612 + 6 好思路!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 05:45 , Processed in 0.036949 second(s), 15 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表