返回列表 发帖
@echo off & setlocal enabledelayedexpansion

set 正模式=
set "正模式=%正模式% ^[1-2][0-9][0-9][0-9]0[1-9]0[1-9]$"
set "正模式=%正模式% ^[1-2][0-9][0-9][0-9]0[1-9]1[0-9]$"
set "正模式=%正模式% ^[1 ...
mxxcgzxxx 发表于 2011-6-4 11:21



提示一下,可以这样输出:
(@for /l %%a in (start 1 end) do @echo %%a)|findstr "正则"COPY
如果日期很多的话,这应该是效率最高的办法了
另一种思路是也许可以用for /l嵌套,采用年循环、月循环、日循环的方式一次性输出正确日期,日期比较少时应该野不慢

TOP

本帖最后由 zm900612 于 2011-6-6 13:03 编辑

这个非常快
@echo off
(cmd /q /v:on /c "for /l %%a in (1990 1 2012) do (for /l %%b in (1 1 12) do (for /l %%c in (1 1 31) do ((set "m=10%%b"&set "d=10%%c")&echo %%a!m:~-2!!d:~-2!)))")|findstr /ve "0[2469]31 0230 1131 [02468][048]0229 [13579][26]0229 [02468][048]000229 [13579][26]000229"
pauseCOPY
为了省些代码只好弄成这个样子了...易读性不是很强,但是思路其实很简单,就是先输出所有有可能合法的日期,再用findstr排除不合法日期...

TOP

漏了排除2月30,已修正

TOP

13# batman


通道之前存在语块时,语块中的内容相当于直接输入到cmd窗口中运行,此时变量延迟是没有效果的,若要用!str!这样的变量,唯有使用cmd /vn来作为语块执行的媒介,而cmd /c是以参数的形式接收要执行的内容,所以无法换行...

整百年份有判断,不过逻辑错误,好像判断反了

TOP

本帖最后由 zm900612 于 2011-6-7 12:19 编辑

这个思路可以有掌声吧?...
@echo off&setlocal enabledelayedexpansion
set min=19900612
set max=20121125
for /l %%a in (31 -1 1) do (
set tmp=0%%a
set md=!md! !tmp:~-2!
)
::先将个位数转换为0开头,避免在循环中计算
set /a y1=%min:~0,-4%,y2=%max:~0,-4%,m1=1%min:~-4,2%-100,m2=1%max:~-4,2%-100,d1=1%min:~-2%-100,d2=1%max:~-2%-100,s1=~-m1*31+d1-1,s2=(13-m2)*31-d2
::进行一些计算,这里的s1和s2是最重要的两个值,直接关系到后文“砍头去尾”的算法
(for /l %%a in (%y2% -1 %y1%) do (
set /a "1/(%%a%%3200)"||set pr=!pr! %%a0229
for %%b in (%md:*13 =%) do (
for %%c in (%md%) do (
echo %%a%%b%%c
)
)
))>tmp 2>nul
::简单输出所有可能正确的日期
more +%s2% tmp|sort|more +%s1%|findstr /e "[^2].. 12.. 02[0-1]. 022[0-8] [02468][048]0229 [13579][26]0229"|findstr /ve "0[2469]31 0230 1131 [02468][048]000229 [13579][26]000229 %pr%">pr.txt
::整个代码最关键的部分,先用more+sort砍头去尾,削除不在要求之内的日期,再用findstr双向筛选排除非法日期
pauseCOPY
日期多的时候,速度相当快

TOP

还真是...测试了下,具体是65535行,看来只能改用for了,不过那效率...
---------- TMP: 74772
more处理后:
---------- TMP2: 65535COPY

TOP

面对大于一百七十多年的情况,修改后是这样:
@echo off&setlocal enabledelayedexpansion
set min=18100101
set max=20100101
for /l %%a in (31 -1 1) do (
        set tmp=0%%a
        set md=!md! !tmp:~-2!
)
::先将个位数转换为0开头,避免在循环中计算
set /a y1=%min:~0,-4%,y2=%max:~0,-4%,m1=1%min:~-4,2%-100,m2=1%max:~-4,2%-100,d1=1%min:~-2%-100,d2=1%max:~-2%-100,s1=~-m1*31+d1-1,s2=(13-m2)*31-d2
::进行一些计算,这里的s1和s2是最重要的两个值,直接关系到后文“砍头去尾”的算法
(for /l %%a in (%y2% -1 %y1%) do (
        set /a "1/(%%a%%3200)"||set pr=!pr! %%a0229
        for %%b in (%md:*13 =%) do (
                for %%c in (%md%) do (
                        echo %%a%%b%%c
                )
        )
))>tmp 2>nul
::简单输出所有可能正确的日期
if %s2% gtr 0 set skip1="skip=%s2%"
(for /f %skip1% %%a in (tmp) do echo %%a)>tmp2
sort tmp2 >tmp
if %s1% gtr 0 set skip2="skip=%s1%"
(for /f %skip2% %%a in (tmp) do echo %%a)>tmp2
findstr /e "[^2].. 12.. 02[0-1]. 022[0-8] [02468][048]0229 [13579][26]0229" tmp2|findstr /ve "0[2469]31 0230 1131 [02468][048]000229 [13579][26]000229 %pr%">pr.txt
::整个代码最关键的部分,先用more+sort砍头去尾,削除不在要求之内的日期,再用findstr双向筛选排除非法日期
pauseCOPY

TOP

本帖最后由 zm900612 于 2011-6-11 14:11 编辑

27# DAIC
[code]@echo off&setlocal enabledelayedexpansion
set min=18100101
set max=20100101
echo %time%
for /l %%a in (31 -1 1) do (
        set tmp=0%%a
        set md=!md! !tmp:~-2!
)
::先将个位数转换为0开头,避免在循环中计算
set /a y1=%min:~0,-4%,y2=%max:~0,-4%,m1=1%min:~-4,2%-100,m2=1%max:~-4,2%-100,d1=1%min:~-2%-100,d2=1%max:~-2%-100,s1=~-m1*31+d1-1,s2=(13-m2)*31-d2
::进行一些计算,这里的s1和s2是最重要的两个值,直接关系到后文“砍头去尾”的算法
(for /l %%a in (%y2% -1 %y1%) do (
        set /a "1/(%%a%%3200)"||set pr=!pr! %%a0229
        for %%b in (%md:*13 =%) do (
                for %%c in (%md%) do (
                        echo %%a-%%b-%%c
                )
        )
))>tmp 2>nul
::简单输出所有可能正确的日期
if %s2% gtr 0 set skip1="skip=%s2%"
(for /f %skip1% %%a in (tmp) do echo %%a)>tmp2
sort tmp2 >tmp
if %s1% gtr 0 set skip2="skip=%s1%"
(for /f %skip2% %%a in (tmp) do echo %%a)>tmp2
findstr /e "[^2]-.. 12-.. 02-[0-1]. 02-2[0-8] [02468][048]-02-29 [13579][26]-02-29" tmp2|findstr /ve "0[2469]-31 02-30 11-31 [02468][048]00-02-29 [13579][26]00-02-29 %pr%">pr.txt
::整个代码最关键的部分,先用more+sort砍头去尾,削除不在要求之内的日期,再用findstr双向筛选排除非法日期
echo %time%
pauseCOPY
少于17年的话,用这个更快
@echo off&setlocal enabledelayedexpansion
set min=18100101
set max=20100101
echo %time%
for /l %%a in (31 -1 1) do (
        set tmp=0%%a
        set md=!md! !tmp:~-2!
)
::先将个位数转换为0开头,避免在循环中计算
set /a y1=%min:~0,-4%,y2=%max:~0,-4%,m1=1%min:~-4,2%-100,m2=1%max:~-4,2%-100,d1=1%min:~-2%-100,d2=1%max:~-2%-100,s1=~-m1*31+d1-1,s2=(13-m2)*31-d2
::进行一些计算,这里的s1和s2是最重要的两个值,直接关系到后文“砍头去尾”的算法
(for /l %%a in (%y2% -1 %y1%) do (
        set /a "1/(%%a%%3200)"||set pr=!pr! %%a0229
        for %%b in (%md:*13 =%) do (
                for %%c in (%md%) do (
                        echo %%a-%%b-%%c
                )
        )
))>tmp 2>nul
::简单输出所有可能正确的日期
more +%s2% tmp|sort|more +%s1%|findstr /e "[^2]-.. 12.. 0-2[0-1]. 02-2[0-8] [02468][048]-02-29 [13579][26]-02-29"|findstr /ve "0[2469]-31 02-30 11-31 [02468][048]00-02-29 [13579][26]00-02-29 %pr%">pr.txt
::整个代码最关键的部分,先用more+sort砍头去尾,削除不在要求之内的日期,再用findstr双向筛选排除非法日期
echo %time%
pauseCOPY

TOP

返回列表