我有一个要求输入的批处理文件,将此输入存储在var中,然后在ping中使用var。我需要确保输入符合几种命名约定之一
命名惯例:
PCX1
可以高达100
GENPRT1
可以高达100
NETPRT1
可以高达100
FAXPRT1
可以高达100
所以,如果我输入12,它将无法工作,但如果我输入PCX12,它将会。
除正则表达式外,脚本中的所有内容都有效。我怎样才能让它发挥作用?
if "%sta%" == "findstr %sta% ^PCX[0-9]*[0-9]*[0-9]$ \i" (
echo The syntax is correct
goto PING
) else (
set errmsg=The syntax is wrong
goto START
)
答案 0 :(得分:0)
这应该有所帮助:
^(PCX|GENPRT|NETPRT|FAXPRT)([\d]|0[\d]|00[\d]|0[\d][\d]|[\d][\d]|100)$
答案 1 :(得分:0)
FINDSTR的正则表达式风格非常有限。它甚至不支持交替(|
),所以即使非常简单的问题也会有非常混乱的解决方案。这是我能提出的最紧凑的表达方式:
FINDSTR /R /I "^PCX[1-9][0-9]?$ ^PCX100$ ^GENPRT[1-9][0-9]?$ ^GENPRT100$ ^NETPRT[1-9][0-9]?$ ^NETPRT100$ ^FAXPRT[1-9][0-9]?$ ^FAXPRT100$"
每个以空格分隔的序列都被视为一个单独的正则表达式,因此这会尝试在它测试的每个字符串上执行最多八个匹配。这并不是说它很慢,但当你习惯了真正的正则表达时,这是一个痛苦的屁股。
作为参考,以下是我如何用纯正的正则表达式来写的:
^(PCX|((GEN|NET|FAX)PRT))([1-9][0-9]?|100)$
如果您可以选择使用其他工具(例如PowerShell,它使用.NET非常强大且功能丰富的正则表达式),我强烈建议您这样做。
答案 2 :(得分:0)
@echo off
setlocal disabledelayedexpansion
:start
set /p "sta=What ? "
cmd /v /d /q /c "(echo(!sta!)" ^
| findstr /i /r /b /e "PCX[0-9]* GENPRT[0-9]* NETPRT[0-9]* FAXPRT[0-9]*" ^
| findstr /r /e "[^0-9][1-9] [^0-9][1-9][0-9] [^0-9]100" > nul
if errorlevel 1 (
echo The syntax is wrong
goto :start
)
echo The syntax is correct
新的cmd
实例用于确保测试的字符串在末尾不包含任何解析器添加的空格。测试echo
命令的输出以查看它是否匹配任何起始字符串,后跟数字直到结尾。然后再次测试有效数字范围。
如果设置了errorlevel,则该值与条件不匹配,并请求新值。
如果未设置errorlevel,则值正确。