web-dev-qa-db-fra.com

Expressions régulières dans findstr

Je fais une petite validation de chaîne avec findstr et son drapeau /r pour permettre les expressions régulières. En particulier, j'aimerais valider des entiers.

La regex

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

a bien fonctionné pour les nombres non négatifs, mais depuis que je supporte maintenant les nombres négatifs, j'ai aussi essayé

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

pour les entiers positifs ou négatifs ou zéro.

La regex fonctionne bien théoriquement . Je l'ai testé dans PowerShell et il correspond à ce que je veux. Cependant, avec

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

ce n'est pas.

Bien que je sache que findstr ne dispose pas du support regex le plus avancé (même en dessous de Notepad ++, ce qui est probablement un exploit), je m'attendais à ce que de telles expressions simples fonctionnent.

Des idées que je fais mal ici?

30
Joey

Cela fonctionne pour moi:

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

Si vous n'utilisez pas l'option /c, l'argument <Strings> est traité comme un list séparé par des chaînes de recherche, ce qui fait de l'espace une sorte de remplacement brut pour la construction |. (Tant que vos regex ne contiennent pas d'espaces, c'est-à-dire.)

45
Alan Moore

Argh, j'aurais dû lire la documentation mieux. findstr ne prend apparemment pas en charge les alternatives (|).

Je suis donc probablement revenu à plusieurs invocations ou à tout remplacer par un analyseur personnalisé.

C'est ce que je fais pour l'instant:

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=
9
Joey

Ou si vous le pouvez, téléchargez grep pour Windows. . Beaucoup plus de fonctionnalités que findstr fournit.

3
ghostdog74

Une regex plus simple réalisant la même chose est possible, ajoutez simplement un signe moins optionnel au début de votre expression d'origine:

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