Регулярные выражения в findstr - PullRequest
31 голосов
/ 10 апреля 2010

Я делаю небольшую проверку строки с findstr и ее флагом /r, чтобы учесть регулярные выражения. В частности, я хотел бы проверить целые числа.

Регулярное выражение

^[0-9][0-9]*$

отлично работал для неотрицательных чисел, но так как теперь я поддерживаю и отрицательные числа, я попытался

^([1-9][0-9]*|0|-[1-9][0-9]*)$

для положительных или отрицательных целых чисел или нуля.

Регулярное выражение прекрасно работает теоретически . Я проверил его в PowerShell, и он соответствует тому, что я хочу. Однако с

findstr /r /c:"^([1-9][0-9]*|0|-[1-9][0-9]*)$"

это не так.

Хотя я знаю, что findstr не обладает самой продвинутой поддержкой регулярных выражений (даже ниже Notepad ++, что, вероятно, является большим достижением), я ожидал бы, что такие простые выражения будут работать.

Есть идеи, что я здесь не так делаю?

Ответы [ 5 ]

47 голосов
/ 11 апреля 2010

Это работает для меня:

findstr /r "^[1-9][0-9]*$ ^-[1-9][0-9]*$ ^0$"

Если вы не используете опцию /c, аргумент <Strings> обрабатывается как разделенный пробелами список поискастроки, что делает пространство своего рода грубой заменой конструкции |.(Если ваши регулярные выражения не содержат пробелов, то есть.)

9 голосов
/ 10 апреля 2010

Argh, я должен был прочитать документацию лучше. 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=
3 голосов
/ 10 апреля 2010

Или, если можете, скачайте grep для windows. . Гораздо больше возможностей, чем обеспечивает findstr.

1 голос
/ 08 апреля 2016

Более простой regex, который позволяет достичь того же самого, возможен, просто добавьте дополнительный минус в начале вашего исходного выражения:

^-?[0-9][0-9]*$
0 голосов
/ 13 июня 2019

Поддержка регулярных выражений в findstr довольно ограничена. Я предлагаю использовать Блокнот ++ . Параметр find in files поддерживает регулярные выражения, совместимые с Perl; Результаты, показывающие имя файла, номер строки и соответствующий текст, могут быть легко скопированы в текстовый файл.

...