标题: [文本处理] 【已解决】BAT批处理中支持这样的正则表达式吗? [打印本页]
作者: xiaolijian916 时间: 2021-7-18 17:28 标题: 【已解决】BAT批处理中支持这样的正则表达式吗?
本帖最后由 xiaolijian916 于 2021-7-19 19:19 编辑
需求是从输入的字符串中判断内容格式:
必须是单个字母(a-q)加上单个数字(1-3)组成(最多两位数)。
比如输入:A1,B2,Q2,则满足第一个条件执行第一个代码块。
如输入:A11,BBB222等不符合正则表达式进入第二个代码块。
如下写法是根据正则表达式定义的,但是匹配始终走的第二代码块,问题出在哪儿了哇。- set /P INP= ^> 请输入命令(P):
- echo; %INP% | findstr /i /r "^[A-Q]{1}[1-3]{1}$" >nul 2>&1 && (
- ECHO 匹配正确:%INP%
- goto dospause1
- ) || (
- ECHO 匹配不正确:%INP%
- goto dospause2
- )
复制代码
作者: newswan 时间: 2021-7-18 17:51
回复 1# xiaolijian916
"|"前面有空格
{1} 可以省略
作者: qixiaobin0715 时间: 2021-7-19 07:03
回复 1# xiaolijian916
findstr不支持正则中的量词表达方式{mix,max};
代码中“echo; %INP% | findstr ”:%INP%前后均不能出现空格和其它无关字符,echo会显示“空格+你输入的字符串+空格”,因此匹配始终走的第二代码块。
作者: Batcher 时间: 2021-7-19 12:04
回复 1# xiaolijian916 - set /p INP=^> 请输入命令(P):
- echo;%INP%|findstr /i "^[A-Q][1-3]$" >nul 2>&1
- if errorlevel 1 (
- echo 匹配不正确:%INP%
- goto dospause2
- ) else (
- echo 匹配正确:%INP%
- goto dospause1
- )
复制代码
作者: xiaolijian916 时间: 2021-7-19 18:45
本帖最后由 xiaolijian916 于 2021-7-19 18:55 编辑
回复 4# Batcher
感谢大大。
作者: xiaolijian916 时间: 2021-7-19 18:47
回复 3# qixiaobin0715
额,犯了低级错误。感谢指出。
作者: xiaolijian916 时间: 2021-7-19 18:49
回复 2# newswan
那个{1}省略也就是说正则情况下系统默认单个字符匹配吧,那如果正则[A-Q]{2}[1-9]{1}岂不是无能为力。。。
作者: xiaolijian916 时间: 2021-7-19 18:58
本帖最后由 xiaolijian916 于 2021-7-19 21:24 编辑
总结下给后来的朋友提供参考:
发现[echo;%INP%],[echo:%INP%],[echo=%INP%],甚至[echo %INP%]写法都能正常执行
随后搜索了下跟效率有关,包括
【=,;】效率最高
【+/[]】效率其次
【:.\】效率最慢- set /P INP= ^> 请输入命令(P):
- REM 【第一种】正则表达式匹配采用BAT方式实现1(效率高)
- echo;%INP%|findstr /i "^[A-Q][1-3]$" >nul 2>&1 && (
- echo 匹配正确:%INP%
- goto dospause1
- ) || (
- echo 匹配不正确:%INP%
- goto dospause2
- )
复制代码
- set /P INP= ^> 请输入命令(P):
- REM 【第二种】正则表达式匹配采用BAT方式实现2(效率高)
- echo;%INP%|findstr /i "^[A-Q][1-3]$" >nul 2>&1
- if errorlevel 1 (
- echo 匹配不正确:%INP%
- goto dospause1
- ) else (
- echo 匹配正确:%INP%
- goto dospause2
- )
复制代码
- set /P INP= ^> 请输入命令(P):
- REM 【第三种】正则表达式匹配采用PS1方式实现(稍慢但扩展性强,支持任意格式正则匹配)
- for /f "delims=" %%a in ('powershell "'%INP%' -match '^[A-Q]{1}[1-3]{1}$'"') do (
- if %%a==True (
- goto dospause1
- ) else (
- goto dospause2
- )
- )
复制代码
作者: newswan 时间: 2021-7-19 18:59
回复 7# xiaolijian916
正则表达式 用 awk grep sed 比较好些
作者: qixiaobin0715 时间: 2021-7-19 19:02
回复 5# xiaolijian916
组合命令、管道命令及重定向命令混合使用时,逻辑要清楚,优先级别不一样。
使用判断语句更易理解。
两者到底哪个效率高,我现在也没搞清楚。
作者: newswan 时间: 2021-7-19 19:10
总结下给以后来的朋友提供参考:
发现[echo;%INP%]与[echo:%INP%]写法都能正常执行
xiaolijian916 发表于 2021-7-19 18:58
调用 powershell 很慢,进入 powershell 都要很多时间
作者: newswan 时间: 2021-7-19 19:12
回复 7# xiaolijian916
不是无能为力,是很费力,一个一个加呗复制代码
作者: xiaolijian916 时间: 2021-7-19 19:15
本帖最后由 xiaolijian916 于 2021-7-19 19:21 编辑
回复 12# newswan
假如英文或数字字符个数不确定就傻眼了
作者: xiaolijian916 时间: 2021-7-19 19:16
回复 11# newswan
我本机测试调用ps1命令比bat命令慢几十毫秒忽略不计了。
作者: newswan 时间: 2021-7-19 19:17
回复 13# xiaolijian916
只支持 * ,连 ? 都不支持,所以很少用 findstr ,通常都 grep
作者: xiaolijian916 时间: 2021-7-19 19:17
回复 10# qixiaobin0715
这倒是代码可读性维护性好些。
作者: xiaolijian916 时间: 2021-7-19 19:20
回复 9# newswan
这些命令需要安装三方工具吧。
作者: xiaolijian916 时间: 2021-7-19 19:22
回复 15# newswan
这里需求刚好简单的英文+数字字符。顺便了解bat里正则支持情况
作者: newswan 时间: 2021-7-19 19:25
回复 17# xiaolijian916
安装 msys2 很多都有了
https://www.msys2.org/
作者: xiaolijian916 时间: 2021-7-19 19:30
回复 19# newswan
原来如此,不过对方需求是不安装三方工具完成功能。
作者: qixiaobin0715 时间: 2021-7-19 19:44
本帖最后由 qixiaobin0715 于 2021-7-19 19:58 编辑
回复 13# xiaolijian916
简单的区间量词可进行模拟,比如模拟正则表达式^[A-Q]{0,2}[1-9]{1}$,可以这样:- findstr /r "^[1-9]$ ^[A-Q][1-9]$ ^[A-Q][A-Q][1-9]$"
复制代码
作者: xiaolijian916 时间: 2021-7-19 20:07
回复 21# qixiaobin0715
写成多组,受教了。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |