Очень хорошее рабочее решение, опубликованное LotPings :
Echo:%newvalue%|findstr "^[0-9][0-9]\.[0-9]$" >Nul 2>&1 &&(echo matched pattern)||(echo didn't match pattern)
Я предлагаю немного другое однострочное решение:
echo:%newvalue%|%SystemRoot%\System32\findstr.exe /R "^[0123456789][0123456789]\.[0123456789]$" >nul && (echo matched pattern) || (echo didn't match pattern)
Или легче читаемоеи работает для любого строкового значения, присвоенного переменной окружения newvalue
:
setlocal EnableExtensions EnableDelayedExpansion
echo:!newvalue!| %SystemRoot%\System32\findstr.exe /R "^[0123456789][0123456789]\.[0123456789]$" >nul
if errorlevel 1 (
echo Value does not match the regular expression pattern.
) else (
echo Value matches the regular expression pattern.
)
endlocal
Между командой echo
и строкой, назначенной переменной окружения newvalue
, вместо пробела используется двоеточие, чтобы избежать этогокоманда ECHO выводит текущий статус команды, эхосигнал в случае newvalue
вообще не определен.
Последнее решение использует задержанное расширение , чтобы избежать того, что командастрока с ECHO и FINDSTR не работает или выполняет что-то совершенно иное, чем написано, если строка, присвоенная переменной newvalue
, содержит операторы, такие как &<>|
.
Важно, чтобы не осталось места для оператора перенаправления |
, который направляет вывод команды ECHO в команду FINDSTR в качестве ввода, посколькуэтого пробела также будет выведен командой ECHO , и регулярное выражение find никогда не будет положительным.Право пробела на |
не имеет значения, как показывает последний пример.
FINDSTR не поддерживает \d
как представление для любой цифры .Необходимо указать символы для сопоставления в собственно определяемом классе символов в квадратных скобках. FINDSTR соответствует [0-9]
символам 0123456789¹²³
.Необходимо использовать [0123456789]
, чтобы соответствовать только символам 0123456789
без ¹²³
.
.
означает любой символ, за исключением точки, экранированной обратной косой чертой, и в этом случае он интерпретируется как литералсимвол.
Строка поиска в "..."
интерпретируется FINDSTR по умолчанию как строка регулярного выражения.Но я думаю, что всегда хорошо использовать /L
или /R
, чтобы сделать на 100% ясным для FINDSTR и для каждого читателя, как следует интерпретировать строку поиска, как литеральную или как обычнуюстрока выражения.
FINDSTR завершается со значением 1
при отсутствии положительного совпадения в потоке искомых входных символов и 0
при хотя бы одном положительном совпадении.Код выхода FINDSTR может быть оценен, как показано выше, и подробно описан в одной строке с несколькими командами с использованием пакетного файла Windows .
Вывод FINDSTR для положительного совпадения не представляет интереса и поэтому перенаправляется на устройство NUL для его подавления.
Для понимания используемых команд и их работы откройте окно командной строки,выполните там следующие команды и внимательно прочитайте все справочные страницы, отображаемые для каждой команды.
echo /?
endlocal /?
findstr /?
if /?
setlocal /?
См. Также статью Microsoft о Использование операторов перенаправления команд и тему форума DosTips ECHO,Не удается дать текст или пустую строку. Вместо этого используйте ECHO / по той причине, что использование :
после echo
часто лучше, чем пробел при выводе строки, прочитанной из файла или введенной пользователем.