Как я могу сделать отрицательное совпадение с регулярным выражением в партии? - PullRequest
0 голосов
/ 31 декабря 2018

На этот раз я не могу создать оператор if для моей предыдущей записи

Я пытаюсь проверить, находится ли значение в этой форме: ^\d\d\.\d$

В большинстве случаев так и будет.Однако иногда он недоступен.

На других языках сценариев я могу им управлять, но по неизвестным причинам не могу понять, как это сделать в пакетном режиме.

Итак, ондолжно быть что-то вроде:

if not findstr /R "^\d\d\.\d$" %newvalue%
set newvalue=

Если это не "^\d\d\.\d$", тогда установите newvalue пустым.Это только пустое значение newvalue, когда оно не найдено, потому что оно даст случайные результаты.

Может кто-нибудь помочь мне?Какой лучший способ сделать это if заявление?

Заранее спасибо.

1 Ответ

0 голосов
/ 31 декабря 2018

Очень хорошее рабочее решение, опубликованное 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 часто лучше, чем пробел при выводе строки, прочитанной из файла или введенной пользователем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...