FINDSTR和RegEx问题

时间:2014-12-01 16:19:59

标签: regex windows batch-file findstr

我有一个要求输入的批处理文件,将此输入存储在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
)

3 个答案:

答案 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,则值正确。