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

[文本处理] 【已解决】BAT批处理中支持这样的正则表达式吗?

[复制链接]
发表于 2021-7-18 17:28:02 | 显示全部楼层 |阅读模式
本帖最后由 xiaolijian916 于 2021-7-19 19:19 编辑

需求是从输入的字符串中判断内容格式:
必须是单个字母(a-q)加上单个数字(1-3)组成(最多两位数)。

比如输入:A1,B2,Q2,则满足第一个条件执行第一个代码块。
如输入:A11,BBB222等不符合正则表达式进入第二个代码块。

如下写法是根据正则表达式定义的,但是匹配始终走的第二代码块,问题出在哪儿了哇。
  1. set /P INP= ^> 请输入命令(P):
  2. echo; %INP% | findstr /i  /r "^[A-Q]{1}[1-3]{1}$" >nul 2>&1 && (
  3.         ECHO 匹配正确:%INP%
  4.         goto dospause1
  5. ) || (
  6.         ECHO 匹配不正确:%INP%
  7.         goto dospause2
  8. )
复制代码
发表于 2021-7-18 17:51:05 | 显示全部楼层
回复 1# xiaolijian916


"|"前面有空格
{1} 可以省略
发表于 2021-7-19 07:03:31 | 显示全部楼层
回复 1# xiaolijian916
findstr不支持正则中的量词表达方式{mix,max};
代码中“echo; %INP% | findstr ”:%INP%前后均不能出现空格和其它无关字符,echo会显示“空格+你输入的字符串+空格”,因此匹配始终走的第二代码块。
发表于 2021-7-19 12:04:42 | 显示全部楼层
回复 1# xiaolijian916
  1. set /p INP=^> 请输入命令(P):
  2. echo;%INP%|findstr /i "^[A-Q][1-3]$" >nul 2>&1
  3. if errorlevel 1 (
  4.     echo 匹配不正确:%INP%
  5.     goto dospause2
  6. ) else (
  7.     echo 匹配正确:%INP%
  8.     goto dospause1
  9. )
复制代码

评分

参与人数 1技术 +1 收起 理由
xiaolijian916 + 1 感谢可用

查看全部评分

 楼主| 发表于 2021-7-19 18:45:20 | 显示全部楼层
本帖最后由 xiaolijian916 于 2021-7-19 18:55 编辑

回复 4# Batcher


    感谢大大。
 楼主| 发表于 2021-7-19 18:47:32 | 显示全部楼层
回复 3# qixiaobin0715


    额,犯了低级错误。感谢指出。
 楼主| 发表于 2021-7-19 18:49:26 | 显示全部楼层
回复 2# newswan


    那个{1}省略也就是说正则情况下系统默认单个字符匹配吧,那如果正则[A-Q]{2}[1-9]{1}岂不是无能为力。。。
 楼主| 发表于 2021-7-19 18:58:06 | 显示全部楼层
本帖最后由 xiaolijian916 于 2021-7-19 21:24 编辑

总结下给后来的朋友提供参考:
发现[echo;%INP%][echo:%INP%],[echo=%INP%],甚至[echo %INP%]写法都能正常执行
随后搜索了下跟效率有关,包括
【=,;】效率最高
【+/[]】效率其次
【:.\】效率最慢
  1. set /P INP= ^> 请输入命令(P):
  2. REM 【第一种】正则表达式匹配采用BAT方式实现1(效率高)
  3. echo;%INP%|findstr /i "^[A-Q][1-3]$" >nul 2>&1 && (
  4.     echo 匹配正确:%INP%
  5.     goto dospause1
  6. ) || (
  7.     echo 匹配不正确:%INP%
  8.     goto dospause2
  9. )
复制代码
  1. set /P INP= ^> 请输入命令(P):
  2. REM 【第二种】正则表达式匹配采用BAT方式实现2(效率高)
  3. echo;%INP%|findstr /i "^[A-Q][1-3]$" >nul 2>&1
  4. if errorlevel 1 (
  5.     echo 匹配不正确:%INP%
  6.     goto dospause1
  7. ) else (
  8.     echo 匹配正确:%INP%
  9.     goto dospause2
  10. )
复制代码
  1. set /P INP= ^> 请输入命令(P):
  2. REM 【第三种】正则表达式匹配采用PS1方式实现(稍慢但扩展性强,支持任意格式正则匹配)
  3. for /f "delims=" %%a in ('powershell "'%INP%' -match '^[A-Q]{1}[1-3]{1}$'"') do (
  4.         if %%a==True (
  5.                 goto dospause1
  6.         ) else (
  7.                 goto dospause2
  8.         )
  9. )
复制代码
发表于 2021-7-19 18:59:30 | 显示全部楼层
回复 7# xiaolijian916


    正则表达式 用 awk grep sed 比较好些
发表于 2021-7-19 19:02:27 | 显示全部楼层
回复 5# xiaolijian916

组合命令、管道命令及重定向命令混合使用时,逻辑要清楚,优先级别不一样。
使用判断语句更易理解。
两者到底哪个效率高,我现在也没搞清楚。
发表于 2021-7-19 19:10:31 | 显示全部楼层
总结下给以后来的朋友提供参考:
发现[echo;%INP%]与[echo:%INP%]写法都能正常执行
xiaolijian916 发表于 2021-7-19 18:58



    调用 powershell 很慢,进入 powershell 都要很多时间
发表于 2021-7-19 19:12:21 | 显示全部楼层
回复 7# xiaolijian916


    不是无能为力,是很费力,一个一个加呗
  1. [A-Q][A-Q][1-9]
复制代码
 楼主| 发表于 2021-7-19 19:15:01 | 显示全部楼层
本帖最后由 xiaolijian916 于 2021-7-19 19:21 编辑

回复 12# newswan


    假如英文或数字字符个数不确定就傻眼了
 楼主| 发表于 2021-7-19 19:16:12 | 显示全部楼层
回复 11# newswan


    我本机测试调用ps1命令比bat命令慢几十毫秒忽略不计了。
发表于 2021-7-19 19:17:15 | 显示全部楼层
回复 13# xiaolijian916


    只支持 * ,连 ? 都不支持,所以很少用 findstr ,通常都 grep
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-20 19:52 , Processed in 0.033415 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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