正则表达式匹配批处理脚本中的变量

时间:2015-12-30 06:49:00

标签: regex batch-file

@echo off

SET /p var=Enter: 
echo %var% | findstr /r "^[a-z]{2,3}$">nul 2>&1
if errorlevel 1 (echo does not contain) else (echo contains)
pause

我试图验证一个应该包含2或3个字母的输入。但我尝试了所有可能的答案,它只运行if error level 1 (echo does not contain)

是的,请有人帮帮我。非常感谢。

5 个答案:

答案 0 :(得分:10)

findstr没有完整的REGEX支持。特别是没有{Count}。您必须使用解决方法:

echo %var%|findstr /r "^[a-z][a-z]$ ^[a-z][a-z][a-z]$"

搜索^[a-z][a-z]$^[a-z][a-z][a-z]$

(注意:%var%|之间没有空格 - 它将成为字符串的一部分)

答案 1 :(得分:3)

由于其他答案不会针对findstr,因此如何运行cscript?这允许我们使用正确的Javascript正则表达式引擎。

@echo off
SET /p var=Enter: 
cscript //nologo match.js "^[a-z]{2,3}$" "%var%"
if errorlevel 1 (echo does not contain) else (echo contains)
pause

match.js定义为:

if (WScript.Arguments.Count() !== 2) {
  WScript.Echo("Syntax: match.js regex string");
  WScript.Quit(1);
}
var rx = new RegExp(WScript.Arguments(0), "i");
var str = WScript.Arguments(1);
WScript.Quit(str.match(rx) ? 0 : 1);

答案 2 :(得分:0)

errorlevel是那个数字或更高。

使用以下内容。

if errorlevel 1 if not errorlevel 2 echo It's just one.

见这个

Microsoft Windows [Version 10.0.10240]
(c) 2015 Microsoft Corporation. All rights reserved.

C:\Windows\system32>if errorlevel 1 if not errorlevel 2 echo It's just one.

C:\Windows\system32>if errorlevel 0 if not errorlevel 1 echo It's just ohh.
It's just ohh.

C:\Windows\system32>

如果高于1且不高于n + 1(在这种情况下为2)

答案 3 :(得分:0)

Stephan's answer在支持正则表达式方面是正确的。但是,它不会将findstr的错误视为[a-z]等字符类的错误 - 请参阅this answer by dbenham

要解决这个问题,你需要指定一下(我知道它看起来很糟糕):

echo %var%|findstr /R "^[abcdefghijklmnopqrstuvwxyz][abcdefghijklmnopqrstuvwxyz]$ ^[abcdefghijklmnopqrstuvwxyz][abcdefghijklmnopqrstuvwxyz][abcdefghijklmnopqrstuvwxyz]$"

这只匹配由两个或三个小写字母组成的字符串。使用范围[a-z]会匹配除<{1}}之外的lower-大写字母。

有关Z的错误和功能的完整列表,请参阅this post by dbenham

答案 4 :(得分:0)

您可以使用Vbscript进行匹配。

更多信息= vbscript_reg_expressions

这是我的方式=

@echo off
SET /p "var=Enter: "
Call :MakeVbs
cscript //nologo Regex-Vbs.vbs "^[a-z]{2,3}$" "%var%"
::Usage: Regex-Vbs.vbs "Regxp" "Str"
Del "Regex-Vbs.vbs"
pause>nul
exit

:MakeVbs
Set F=Regex-Vbs.vbs
echo Set re=New RegExp>%F%
Echo With re>>%F%
Echo  .Pattern=WSH.Arguments(0)>>%F%
Echo End With>>%F%
Echo If re.Test(WSH.Arguments(1)) Then 'Test method>>%F%
Echo WSH.Echo "Match !!">>%F%
Echo Else>>%F%
Echo WSH.Echo "Not Match !!">>%F%
Echo End If:Set re=Nothing>>%F%
exit /b