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

22
@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)时才能运行。

可以有人帮助我吗?非常感谢。

4个回答

13

findstr没有完整的正则表达式支持,尤其是没有{Count}。你必须使用一个解决方法:

findstr没有完整的正则表达式支持,特别是不支持 {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%|之间没有空格-它将成为字符串的一部分)


5

既然没有其他答案反对使用 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);

1

Stephan的答案在支持正则表达式方面是正确的。然而,它没有考虑到findstr关于字符类(如[a-z])的一个错误--请参见dbenham的这个答案

为了克服这个问题,你需要指定如下内容(我知道它看起来很糟糕):

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

这个匹配模式只适用于由两三个小写字母组成的字符串。使用范围 [a-z] 可以匹配大小写字母,但不包括大写字母 Z

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


"(我知道它看起来很糟糕):" - ruffin

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)


第一句话的意思是_errorlevel是那个数字或更高_或者_不是那个数字或更高_。 - user5721973
findstrerrorlevel 不会给出计数,而只会返回 0(至少找到一个)或 1(未找到)。 - Stephan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接