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

回复 8# ads350668398

经测试可用。添加其他规则方法类似,如果很多的话可以再套一个for循环
  1. @echo off
  2. (for /f "tokens=*" %%a in (1.txt)do (
  3.   set/a js=os=fs=0
  4.   for %%i in (%%a)do (
  5.      2>nul set/a1/(1%%i"&"1^)&&set/a js+=1||set/a os+=1
  6.      rem 添1防当成八进制
  7.      rem 数是奇数则js+1,偶数同理。最后js=0则说明全偶,os=0则说明全奇。
  8.      2>nul set/a1/(3%%i%%3^)&&set/a fs+=1
  9.      rem 最后fs[非三]=0则说明全是3的倍数。
  10.      )
  11.   2>nul set/a1/(js*os*fs^)&&echo %%a
  12.      rem 只要有1个为0就不会回显
  13. ))>"2.txt"
复制代码
1

评分人数

TOP

回复 17# 老刘1号


    赞成,排BUG有时候最后排出来是真的气……自己感觉语法没问题,但就是会报错,还得把踩雷的写法记下来不能犯,非常憋屈。

TOP

回复 20# Batcher


    我已经找到原因了。用的是您在4楼发的代码,执行失败原因是我把它拖进cmd执行,直接双击是可以正常使用的。
我自己的代码也已经找到问题所在(set/a中的括号没有转义、注释用了::而不是rem)并修复了,并在之前的位置重新编辑了一下。

TOP

本帖最后由 hongrk 于 2019-6-5 14:49 编辑

做了一个通用的版本。
规则:
1.用S2表示本行第2个数,其他同理。
2.本行数的总数用n表示。
3.同一行的小节规则用""包起来,同一大节的规则之间空格隔开。
4.同一规则重复检测格式:"起始位置 间隔 中止位置(直到最后则写n)""其他规则1""其他规则2"
在此格式中,用%%i表示不确定的位置。还可以实现对%%i进行各种运算,用[]包起来即可。
5.可以自创变量进行赋值(不与已用变量冲突即可,如可使用A1、A2、B1等等)。格式相当于省去了set/a的set/a
6.检验部分相当于省去了if的if
举个例子:
"n GTR 3" "3 1 n""S%%i==S[%%i-1]+S[%%i-2]" "S2==50" "1 1 n""B1+=S%%i" "B1 GTR 100"
这是斐波那契数列的规则,且要求第2个数是50,全部数加起来超过100.
这个分析器可以实现之前代码的所有功能,并且要强大出许多。
【BUG这下应该算是彻底修好了!】

代码如下。
  1. @echo off&setlocal enabledelayedexpansion
  2. echo 默认目标文档为“分析器”目录下的2.txt
  3. set/p rule=请拖入规则文档:
  4. rem 先读取规则,分行读取,G系列存规则,变量Gn用于标记这是第几行规则(在下一部分即总共有几行规则)。(G:Gui则)(n:number)
  5. for /f "tokens=*" %%a in (%rule%)do (
  6.   set/a Gn+=1
  7.   for /f "tokens=1*" %%b in ("!Gn! %%a")do set G%%b=%%c
  8. )
  9. set/p shu=请拖入待处理文档:
  10. cls
  11. rem n系列:存每一行的数总数。 S系列(Shu):存每一行的每一个数。 F系列:存是否符合对应规则行,符合为1否则为0.  
  12. rem 按行读取待检测的数,先赋好一行,然后再执行规则,最后判断执行结果。完成后读取下一行数。
  13. (for /f "tokens=*" %%a in (%shu%)do (
  14.   setlocal
  15.   for %%b in (%%a)do set/a n+=1&set S!n!=%%b
  16.   for /l %%b in (1 1 %Gn%)do (
  17.     for %%c in (!G%%b!)do (
  18. rem 把一行规则分解为几节逐一分析检验
  19.       for /f tokens^=1*^ delims^=^" %%d in ("%%~c")do (
  20.         if "%%e"=="" (set forl=&set t=%%d
  21.         )else set t=%%e&for /f "tokens=1-3 delims=,; " %%f in ("%%d")do (
  22.                 set/a Z1=%%f,Z2=%%g,Z3=%%h
  23.                 set "forl=for /l %%i in (!Z1! !Z2! !Z3!^)do"
  24.               )
  25. rem 若此节规则的中间没有引号,说明没有类似"1 1 n"的结构;否则要准备开for /l了。将去除"for /l"结构后的“整节规则”赋给t。
  26.         set "t=!t:""=" "!"
  27. rem 准备开始分割小节规则。
  28.         call :forl %%b
  29.       )
  30. rem 此节规则结束。
  31.     )
  32. rem 此行规则结束。
  33.     set/a f+=f%%b
  34.   )
  35. rem 对此行数,所有规则结束。
  36.   if !f!==0 echo %%a
  37. rem 只要有一行规则完全符合,就不输出
  38.   endlocal
  39. ))>2.txt
  40. exit
  41. rem %t%存整节规则,!t!存小节规则。
  42. :forl
  43. (%forl% (
  44.   for %%j in ("%t%")do (
  45.     set Le=&set Ri=
  46.     set t=%%~j&set t=!t:%%%%i=%%i!
  47. rem 因为前面在整节规则中造出了空格,因此可用for截取小节规则。
  48.     for %%k in ("!t!")do (
  49.       set u=!t:%%~k!
  50.       set center==
  51.       if "!u:~,1!"=="=" set center===
  52.       if "!u:~,1!"=="t" set center=
  53.     )
  54. rem 以上利用字符串替换对"="的检测规律,来分析t,也就是小节规则,是0个/1个/2个等于号中的哪一种。
  55.     for /f "tokens=1-3 delims== " %%k in ("!t!")do (
  56.       set Le.ft=%%k
  57.       if "!center!"=="" (set center=%%l&set Ri.ght=%%m)else set Ri.ght=%%l
  58.     )
  59. rem 分割小节规则
  60.     for %%k in (Le.ft Ri.ght)do (
  61.       set %%k=!%%k:[= !&set %%k=!%%k:]= !
  62.       set QAQ=0
  63.       for %%l in (!%%k!)do (
  64.         2>nul set/a AQA=%%l
  65.         2>nul set/a QAQ+=1,1/(QAQ"&"1^)&&set %%~nk=!%%~nk!%%l||set %%~nk=!%%~nk!!AQA!
  66.       )
  67.     )
  68. rem 处理[]
  69.     if "!center!"=="=" (set/a !Le!=!Ri!)else set/a Le=!Le!,Ri=!Ri!&call :zl %1
  70. rem 若是赋值规则就直接打包set/a;若是比较规则,左右计算后进行比较。
  71.   )
  72. )
  73. )&exit/b
  74. :zl
  75. rem if语句做不到耐心地把感叹号扩充开再判断语句是否合理,所以——
  76. if %Le% %center% %Ri% (if not defined F%1 set F%1=1)else set F%1=0
  77. rem F%1是用来存这行数对应这行规则的判定结果。有一节规则不满足就不算满足此行规则。符合为1,不符合为0.
  78. exit/b
复制代码
2

评分人数

    • Taurus: 回敬技术 + 1
    • amwfjhh: 纯P实现,语法规则使用遛得飞起……技术 + 1

TOP

返回列表