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

[数值计算] 讨论:批处理命令FINDSTR通配符的限定输入!

[复制链接]
发表于 2025-8-29 20:35:29 | 显示全部楼层 |阅读模式
写了个脚本!限定输入字符,输入字符里包含数字和运算符号  + - * /  加减乘除 ,发现一个有趣的问题.不同的符号排序会引起不同的结果!
限定 SA 必须带运算 符 +1 -1 *1 /1 否则不执行。。。echo.5555555555555只是暂做观察,实际是GOTO其他,,,
  1. @echo off
  2. set /p sa=
  3. Echo.%sa%|FindStr "^[-+/*].[0-9]*$">Nul && echo.5555555555555
  4. pause
复制代码
能正常表达 ,+0 -0 *0 /0 ,,,


而排序,,,
  1. Echo.%sa%|FindStr "^[+-/*].[0-9]*$">Nul && echo.5555555555555
复制代码
  1. Echo.%sa%|FindStr "^[+-*/].[0-9]*$">Nul && echo.5555555555555
复制代码
  1. Echo.%sa%|FindStr "^[/*+-].[0-9]*$">Nul && echo.5555555555555
复制代码
  1. Echo.%sa%|FindStr "^[*/-+].[0-9]*$">Nul && echo.5555555555555
复制代码
表达不成功,,,,

表达成功的前提是 - +   的顺序不能变,, - 号必须在前面 变了就乱了,,
在前面加个  ^- 也没啥用
  1. Echo.%sa%|FindStr "^[+^-/*].[0-9]*$">Nul && echo.5555555555555
复制代码
各种奇奇怪怪的排序组合,,,呢?,,
  1. Echo.%sa%|FindStr "^[+-/*][0-9]*$">Nul && echo.5555555555555
复制代码
  1. Echo.%sa%|FindStr "^[-+/*0-9]*$">Nul && echo.5555555555555
复制代码
  1. Echo.%sa%|FindStr "^[-+/*?0-9]*$">Nul && echo.5555555555555
复制代码
  1. Echo.%sa%|FindStr "^[-+/*]*[0-9]*$">Nul && echo.5555555555555
复制代码
呵,,,疯了,,,,

或者还有其他排序,懒得测了!
这个是个问题!,,也是个小疑惑吧!,,,
想听听,各位大神有什么更好,更全面的解答,,,吗!?

疑问:如果加入其他符号或运算表达呢?,, ~ ! @ # $ % ^ & < > =  
这个牛角不能只让我一个人来钻,,,讨论讨论呗!,,,,,,
发表于 2025-8-29 23:06:42 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-8-29 23:31 编辑

回复 1# jiavip

   findstr 并无内置方法支持 '逻辑与' 的匹配模式(每个匹配字符须同时存在),因此一楼示例代码仅是 '逻辑或' 的匹配模式(只须任一个匹配字符存在即可),不能满足‘必须带运算符 +1 -1 *1 /1’的 '逻辑与' 匹配要求。
   如果在一个匹配表达式中实现 '逻辑与' 就要限定多个匹配字符的先后顺序,如 findstr /r "+.*\-.*\*.*/.*[0-9]",故这种方法只能用于明确每个匹配字符顺序关系的实况。
   另一种可不限于多个匹配字符顺序关系的 '逻辑与' 用法如下
   echo,%str%|findstr  "+" | findstr /r "\-" | findstr /r "\*" | findstr /r "\/" | findstr /r "[0-9]">nul&&echo,ok
   以上句式虽然冗长,但却能实现多个匹配字符的 '逻辑与' 模式...
 楼主| 发表于 2025-8-29 23:30:17 | 显示全部楼层
回复 2# aloha20200628


    其实,我第一段写的,已经满足要求了!
数组就是用来set/a 数值=%数组%%sa% 而已,不需要多个符号,,
这个帖子就是讨论它的排序问题而已。
发表于 2025-8-29 23:36:21 | 显示全部楼层
回复 3# jiavip

二楼回帖缘起一楼所述 ‘限定 SA 必须带运算符 +1 -1 *1 /1 否则不执行。。。’
发表于 2025-8-30 01:14:48 | 显示全部楼层
啊,这个我知道
- 号是正则的范围连接符,而+-/是指+号至/号,^-/是指^号至/号,因此- 号是需要放在前面的
finstr好像不是用的ascii码符号的,匹配可见字符其他正则可以直接用[ -~](空格号至~号,ascii码32-126),而finstr直接用[ -~]的话会有遗漏

评分

参与人数 1技术 +1 收起 理由
jiavip + 1 靠谱解答

查看全部评分

 楼主| 发表于 2025-8-30 07:12:47 | 显示全部楼层
回复 4# aloha20200628


    呵,,是我的输入的坏习惯,经常懒得加分隔符,,几十年的坏习惯了改不过来,,也难怪你误解。。。
 楼主| 发表于 2025-8-30 07:17:34 | 显示全部楼层
回复 5# HalloWord


    我也有怀疑过范围性的问题,只不过不是很确定!毕竟符号之间的范围排序不是很了解,不知道它们是否和数字和字母那样可以范围选择。,,
发表于 2025-8-30 07:47:14 | 显示全部楼层
5楼已解答。
所以转义下应该就可以, [+\-*/]
发表于 2025-8-30 09:01:30 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-8-30 09:23 编辑

回复 1# jiavip

如果匹配字符是 '逻辑或' 模式,只须对 '或' 字符集即 [...] 表达式的保留字如 -[]^ 等加持 findstr 采用的转义符 \ 即可与匹配顺序无关了...

  1. echo,%sa%|findstr /r "[0-9+\-/*]">nul&&echo,ok
复制代码
 楼主| 发表于 2025-8-30 16:39:43 | 显示全部楼层
回复 9# aloha20200628


    你这样写法,输入单数字或单符号就是通过了,,,
发表于 2025-8-30 17:19:18 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-8-30 17:22 编辑

回复 10# jiavip

对于同时包含多个运算符 +-*/ 的字符串匹配(即少一个匹配字符都不行),可简化2楼第二个句式如下:

  1. echo,%sa%|findstr "+"|findstr "\-"|findstr "\*"|findstr "\/"|findstr /r "[0-9]">nul&&echo,ok
复制代码
 楼主| 发表于 2025-8-30 17:41:05 | 显示全部楼层
回复 11# aloha20200628


    没那么复杂吧!我写的第一段前面没包含+-*/ 后面没数字,是通不过的,,
发表于 2025-8-30 18:39:22 | 显示全部楼层
本帖最后由 77七 于 2025-8-30 18:44 编辑

^[-+/*].[0-9]*$
后面的[0-9]* 表示[0-9]可以为0次;中间的点匹配了一个单字节字符,有一定限制作用。
发表于 2025-8-30 19:05:15 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-8-30 23:00 编辑

回复 12# jiavip

用1楼第一段代码第3行为例 Echo,%sa%|FindStr "^[-+/*].[0-9]*$">Nul && @echo,ok 作个说明,其匹配%sa%字符串的模式是如 xyz,其中 x 须为 [...] 中的某个字符,y 则必须且可为任一字符,z 可为 0-n 个数字。因此,如下示例表明 %sa% 取值会匹配成功(其中因保留字 - 置于表达式开头,未发挥 a-b 的 '范围' 作用,故被转为有效可匹配字符,与 \- 同效)
   +1
   -1
   /1
   *1
   +a1
   +a789

而如下示例表明 %sa% 取值会匹配失败
   +
   a
   1
   a1
   a+
   1a
   2+1
   9-4+1/2*3
   666/6-1*3+2
   abc

至于楼主所谓 %sa% 不包含任何匹配字符亦会失败,可归于以上失败示例中的最后一例,而其中的
   9-4+1/2*3
   666/6-1*3+2
均符合 +-/*1 这些匹配字符的 '逻辑与' 匹配模式,故可被11楼例式匹配成功...
发表于 2025-8-30 22:27:12 | 显示全部楼层
回复 7# jiavip


   范围是也许是任意的,而且还有中文的范围:[一-龥],在其他里就见过这样的
findstr的['-z]就涵盖了大部分符号,数字和字母,只是还是不知道findstr所用的符号表
1楼不成功应该是无效范围,+符号排在/符号后面,范围 +-/ 无效
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 07:05 , Processed in 0.029727 second(s), 12 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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