Я делаю немного строковой проверки с findstr
и /r
флаг для обеспечения регулярных выражений. В особенности я хотел бы проверить целые числа.
regex
^[0-9][0-9]*$
хорошо работавший для неотрицательных чисел, но так как я теперь поддерживаю отрицательные числа также, я попробовал
^([1-9][0-9]*|0|-[1-9][0-9]*)$
или для положительных или для отрицательных целых чисел или нуля.
regex хорошо работает теоретически. Я протестировал его в PowerShell, и это соответствует тому, что я хочу. Однако с
findstr /r /c:"^([1-9][0-9]*|0|-[1-9][0-9]*)$"
это не делает.
В то время как я знаю это findstr
не имеет самой усовершенствованной поддержки regex (даже ниже Блокнота ++, который является, вероятно, настоящим успехом), я ожидал бы, что такие простые выражения будут работать.
Какие-либо идеи, что я делаю неправильно здесь?
Это работает для меня:
findstr /r "^[1-9][0-9]*$ ^-[1-9][0-9]*$ ^0$"
Если вы не используете параметр / c
, параметр
аргумент обрабатывается как разделенный пробелами список строк поиска, что делает пробел своего рода грубой заменой конструкции |
. (Пока ваши регулярные выражения не содержат пробелов.)
Ага, мне следовало бы прочитать документацию лучше. findstr
очевидно не поддерживает чередования ( |
).
Так что я, вероятно, вернусь к многократным вызовам или заменю все это на собственный синтаксический анализатор.
Вот что я сейчас делаю:
set ERROR=1
rem Test for zero
echo %1|findstr /r /c:"^0$">nul 2>&1
if not errorlevel 1 set ERROR=
rem Test for positive numbers
echo %1|findstr /r /c:"^[1-9][0-9]*$">nul 2>&1
if not errorlevel 1 set ERROR=
rem Test for negative numbers
echo %1|findstr /r /c:"^-[1-9][0-9]*$">nul 2>&1
if not errorlevel 1 set ERROR=
Или, если есть возможность, скачайте grep для windows. . Гораздо больше возможностей, чем предоставляет findstr
.