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

OK
感谢提醒
我的关于“正向、反向”的提法有问题
/v开关的“不包含匹配”用在正则中
实际上是指“任一模式串均不匹配”
使用/v开关后不需要改变模式串
也可以可通过逆变&&后面的程序逻辑得到相同的效果

我所说的反向应该是指模式串的“反向”
即正向模式串的逆变

正向确实是“符合任意一条都匹配”
我的正向模式串正体现了这一特性

^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$
是判定日期串长度合法而非非法的
虽然使用/v或者逆变程序逻辑
可以独立地判定字符串长度非法
但是无法与逆向模式串结合使用

我想了一下
关于逆向模式串长度非法只能使用
^$
^.$
^..$
^...$
^....$
^.....$
^......$
^.......$
^..........*$

结合其他逆向的模式
组建非法日期的模式串
[^0-9]
^[3-9]
00..$
1[3-9]..$
[2-9]...$
00$     
3[2-9]$
[4-9].$
0[469]31$
1131$
0230$
0229$

以上不考虑闰年计算的
考虑闰年需要将最后一条替换成
[13579]0229$
[13579][048]0229$
[02468][26]0229$
[13579]000229$
[13579][048]000229$
[02468][26]000229$
天的白色影子

TOP

本帖最后由 caruko 于 2011-5-30 16:53 编辑

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

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

评分人数

TOP

按照合法日期的模式排列了组合一下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条

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

评分人数

    • zm900612: 好思路!第一个想到反向排除PB + 6
天的白色影子

TOP

判断年份能被4整除很容易:
echo 20080102|findstr /e "[02468][048].... [13579][26]...."
若要同时对百位判断,只需要把这两条关键词排列组合成四条关键词就行了。
不过如果和日期放在一起排列组合,那...
1

评分人数

    • qzwqzw: 感谢提供闰年思路,只是不知是否原创?技术 + 1

TOP

findstr 如何判断年份被被4整除呢?

TOP

另外,如果只是用findstr判断平润年,还是可行的

TOP

20# caruko


晕,看来又撞车了

TOP

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

TOP

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
复制代码

TOP

19# caruko
看见光明了!~
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

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

TOP

本帖最后由 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 合法
复制代码

TOP

本帖最后由 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,合法
复制代码
2

评分人数

    • zm900612: 难为你了,哈哈。技术 + 1
    • batman: 鼓励鼓励,请再修改 充分利用题意哦。。。PB + 5

TOP

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

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

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

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

TOP

应该是用到了多个模式串来处理不同月份不同天数的问题
只是平闰年判断尚没有不用set的思路

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

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

评分人数

天的白色影子

TOP

返回列表