Windows Cmd findstr - 数字正则表达式不起作用

Windows Cmd findstr - Regex with digits not working

我正在尝试验证传递给批处理文件的 IP 地址参数是否有效。 不幸的是,Windows findstr 不能可靠地工作,尽管输入的正则表达式是匹配的。

以下是所有结果的总结。

findstr 将 errorlevel 设置为 0(如果有匹配),如果没有匹配则为 1。

C:\iSTEP\VMTicketing\RealVNC>echo 192.10.10.10 | findstr /R "[0-2][0-9][0-9]\.[0-2][0-9][0-9]\.[0-2][0-9][0-9]\.[0-2][0-9][0-9]"

C:\iSTEP\VMTicketing\RealVNC>echo %errorlevel%
1

C:\iSTEP\VMTicketing\RealVNC>echo 192.101.101.101 | findstr /R "[0-2][0-9][0-9]\.[0-2][0-9][0-9]\.[0-2][0-9][0-9]\.[0-2][0-9][0-9]"
192.101.101.101

C:\iSTEP\VMTicketing\RealVNC>echo %errorlevel%
0

C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /R "[0-2][0-9][0-9]?\.[0-2]?[0-9][0-9]?\.[0-2]?[0-9][0-9]?\.[0-2]?[0-9][0-9]?"

C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /R "[0-2]?[0-9][0-9]?\.[0-2]?[0-9][0-9]?\.[0-2]?[0-9][0-9]?\.[0-2]?[0-9][0-9]?"

C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /R "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"

C:\iSTEP\VMTicketing\RealVNC>echo %errorlevel%
1

C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /b /e /R "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"

C:\iSTEP\VMTicketing\RealVNC>echo %errorlevel%
1

C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /b /e /R "\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b"

C:\iSTEP\VMTicketing\RealVNC>echo %errorlevel%
1

C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /b /e /R "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"

C:\iSTEP\VMTicketing\RealVNC>echo %errorlevel%
1

C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /b /e /R "*\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}*"
FINDSTR: No search strings

C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /b /e /R "*\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
FINDSTR: No search strings

C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /b /e /R "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}*"

C:\iSTEP\VMTicketing\RealVNC>echo %errorlevel%
1

C:\iSTEP\VMTicketing\RealVNC>echo 1.1.1.1 | findstr /b /e /R "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\>"

C:\iSTEP\VMTicketing\RealVNC>echo %errorlevel%
1

Commandoutput

使用 powershell 正则表达式执行匹配的简单方法:

@Echo off
 Call :Regex "131.21.1.101" "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
 Echo(%Errorlevel%
 Call :Regex "1321.101" "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
 Echo(%Errorlevel%
Goto :Eof

:Regex
 powershell.exe -noprofile -c "'%~1' -match '%~2'" | findstr /l "True" > nul || Exit /b 1
Exit /b 0

有关 powershell 正则表达式语法的详细信息,请参阅 here

我刚刚尝试了以下方法:

echo 1.1.1.1 | findstr "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*"

看起来它工作正常,但还有其他问题,比如像 isolationlayer_31bf3856ad364e35_10.0.14393.479_none_3b8c 这样的奇怪值也被显示。