@echo off

SET /p var=Enter: 
echo %var% | findstr /r "^[a-z]{2,3}$">nul 2>&1
if errorlevel 1 (echo does not contain) else (echo contains)
pause

J'essaye de valider une entrée qui devrait contenir 2 ou 3 lettres. Mais j'ai essayé toutes les réponses possibles, cela ne fonctionne que if error level 1 (echo does not contain).

Quelqu'un peut-il m'aider s'il vous plaît. Merci beaucoup.

17
Nicholas Chan 30 déc. 2015 à 09:49

4 réponses

Meilleure réponse

findstr n'a pas de support REGEX complet. Surtout pas {Count}. Vous devez utiliser une solution de contournement:

echo %var%|findstr /r "^[a-z][a-z]$ ^[a-z][a-z][a-z]$"

Qui recherche ^[a-z][a-z]$ OU ^[a-z][a-z][a-z]$

(Remarque: il n'y a pas d'espace entre %var% et | - cela ferait partie de la chaîne)

11
Stephan 30 déc. 2015 à 08:32

La réponse de Stephan est correcte en termes de prise en charge des expressions régulières. Cependant, il ne considère pas un bogue de findstr concernant des classes de caractères comme [a-z] - voir cette réponse de dbenham.

Pour surmonter cela, vous devez spécifier ceci (je sais que cela a l'air terrible):

echo %var%|findstr /R "^[abcdefghijklmnopqrstuvwxyz][abcdefghijklmnopqrstuvwxyz]$ ^[abcdefghijklmnopqrstuvwxyz][abcdefghijklmnopqrstuvwxyz][abcdefghijklmnopqrstuvwxyz]$"

Cela correspond vraiment uniquement aux chaînes composées de deux ou trois lettres minuscules. L'utilisation de plages [a-z] correspondrait aux lettres minuscules et majuscules sauf Z.

Pour une liste complète des bogues et des fonctionnalités de findstr, reportez-vous à ce message de dbenham.

0
Community 23 mai 2017 à 11:54

Errorlevel est ce nombre OU PLUS ÉLEVÉ.

Utilisez ce qui suit.

if errorlevel 1 if not errorlevel 2 echo It's just one.

Regarde ça

Microsoft Windows [Version 10.0.10240]
(c) 2015 Microsoft Corporation. All rights reserved.

C:\Windows\system32>if errorlevel 1 if not errorlevel 2 echo It's just one.

C:\Windows\system32>if errorlevel 0 if not errorlevel 1 echo It's just ohh.
It's just ohh.

C:\Windows\system32>

Si supérieur à un et non supérieur à n + 1 (2 dans ce cas)

0
user5721973user5721973 30 déc. 2015 à 07:47

Puisque les autres réponses ne sont pas contre findstr, qu'en est-il de l'exécution de cscript? Cela nous permet d'utiliser un moteur de regex Javascript approprié.

@echo off
SET /p var=Enter: 
cscript //nologo match.js "^[a-z]{2,3}$" "%var%"
if errorlevel 1 (echo does not contain) else (echo contains)
pause

match.js est défini comme:

if (WScript.Arguments.Count() !== 2) {
  WScript.Echo("Syntax: match.js regex string");
  WScript.Quit(1);
}
var rx = new RegExp(WScript.Arguments(0), "i");
var str = WScript.Arguments(1);
WScript.Quit(str.match(rx) ? 0 : 1);
4
Stephen Quan 3 mai 2019 à 20:34