2015-12-30 9 views
11
@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 

Próbuję sprawdzić dane wejściowe, które powinny zawierać 2 lub 3 litery. Ale próbowałem wszystkie możliwe odpowiedzi, działa tylko if error level 1 (echo does not contain).Regex, aby dopasować zmienną w skryptach wsadowych

Czy ktoś może mi pomóc proszę. wielkie dzięki.

Odpowiedz

7

findstr ma pełne wsparcie REGEX. Zwłaszcza nr {Count}. Trzeba korzystać z obejścia:

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

który wyszukuje ^[a-z][a-z]$ LUB ^[a-z][a-z][a-z]$

(Uwaga: nie ma przestrzeni między %var% i | - byłoby częścią łańcucha)

0

poziom błędu to liczba LUB WYŻSZY.

Użyj następującego.

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

Patrz to

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> 

jeśli jest większa niż jeden i nie więcej niż N + 1 (2, w tym przypadku)

+1

..i nie dostać to –

+0

Pierwsze zdanie mówi _errorlevel jest to, że liczba lub HIGHER_ lub _NOT że liczba lub higher_ –

0

Stephan's answer jest poprawne pod względem wsparcia dla regularnej ekspresji. Nie dotyczy jednak błędu z findstr dotyczącego klas znaków, takich jak [a-z] - patrz this answer by dbenham.

Do tego trzeba określić to (wiem, że to wygląda okropnie) przezwyciężyć:

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

To naprawdę pasuje tylko ciągi składające się z dwóch lub trzech małych liter. Używanie zakresów [a-z] pasuje do niższych-i wielkich liter z wyjątkiem Z.

Pełna lista błędów i funkcji findstr, numer referencyjny this post by dbenham.

0

Ponieważ inne odpowiedzi nie są skierowane przeciwko findstr, howebout running cscript? Doing pozwala nam używać odpowiedniego silnika regex.

@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 

Gdzie match.js jest zdefiniowany jako:

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);