Regex для сопоставления переменной в командах Batch
@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)
.
Может кто-нибудь мне помочь. Большое спасибо.
Ответы
Ответ 1
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%
и |
нет пробела - это будет частью строки)
Ответ 2
Поскольку другие ответы не против 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);
Ответ 3
errorlevel - это число ИЛИ ВЫШЕ.
Используйте следующую команду.
if errorlevel 1 if not errorlevel 2 echo It 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 just one.
C:\Windows\system32>if errorlevel 0 if not errorlevel 1 echo It just ohh.
It just ohh.
C:\Windows\system32>
Если выше, чем одно и не выше n + 1 (2 в этом случае)
Ответ 4
Ответ Стефана является правильным с точки зрения поддержки регулярного выражения. Тем не менее, он не учитывает ошибку findstr
в отношении классов символов, таких как [a-z]
- см. этот ответ dbenham.
Чтобы преодолеть это, вам нужно указать это (я знаю, он выглядит ужасно):
echo %var%|findstr /R "^[abcdefghijklmnopqrstuvwxyz][abcdefghijklmnopqrstuvwxyz]$ ^[abcdefghijklmnopqrstuvwxyz][abcdefghijklmnopqrstuvwxyz][abcdefghijklmnopqrstuvwxyz]$"
Это действительно соответствует только строкам, состоящим из двух или трех строчных букв. Использование диапазонов [a-z]
соответствует символам нижнего и верхнего регистра, кроме Z
.
Полный список ошибок и функций findstr
, ссылка этого сообщения от dbenham.