2017-09-17 9 views
2

Frage Batch File input validation - Make sure user entered an integer , hat diese Antwort:Warum ist 2 mal [0-9] besser als einmal?

echo %userinput%|findstr /r /c:"^[0-9][0-9]*$" >nul

if errorlevel 1 (echo not a number) else (echo number)

Dies verwendet findstr regulären Ausdruck übereinstimmen Fähigkeiten:

Sie auch einen ganz einfachen Trick verwenden können. Sie sind nicht sehr beeindruckend, aber manchmal nützlich.

Meine Frage - warum wird [0-9] zweimal geschrieben?

+0

Da sonst eine leere Zeichenfolge übereinstimmen würde. – melpomene

+1

@trincot 'findstr' unterstützt' + 'nicht. – melpomene

Antwort

2

Die Ausführung in einem Eingabeaufforderungsfenster findstr /? gibt die Hilfe für diesen Befehl aus.

Die Suche regulärer Ausdruck bedeutet:

  • ^ ... einen String findet bei einer
  • [0-9] ... Zeile beginnen, die mindestens 1 Stelle
  • [0-9]* hat ... und kann haben 0 oder mehr Ziffern
  • $ ... und endet am Ende der Zeile.

In anderen Worten, die Ausgangsleitung von ECHO muss 0 auf Umgebungsvariable ERRORLEVEL zugewiesen für eine positive Übereinstimmung mit Exit-Code hat 1 oder mehr Ziffern und keinen anderen Charakter. Jede andere Zeichenfolge in der Ausgabezeile führt zu keinem Übereinstimmungs- und Beendigungscode 1.

Die erste [0-9] wird benötigt, um sicherzustellen, dass die Benutzereingabe aus mindestens 1 Ziffer besteht. Andernfalls würde eine leere Zeile auch zu einer positiven Übereinstimmung führen. FINDSTR unterstützt keinen Multiplikator +, der in anderen Anwendungen mit Unterstützung für reguläre Ausdrücke 1 oder mehr des vorherigen Zeichens oder der Zeichenklasse oder des Ausdrucks bedeutet.

Nun, eine nicht definierte userinput würde in Ausgabe ECHO is OFF oder ECHO is ON führen durch FINDSTR zu verarbeiten, wenn userinput nicht vor set /P "userinput=prompt text: " definiert wurde und der Benutzer trifft nur RETURN oder ENTER. Aus diesem Grund würde ^[0-9]*$ auch hier zufällig funktionieren, da es hier nicht dazu kommt, dass FINDSTR eine Leerzeile verarbeiten muss.

Aber FINDSTR hat einige unerwartete übereinstimmende Verhalten.Zum Beispiel [0-9] Streichhölzer auch ² und ³ auf aktuelle Codepage je finden What are the undocumented features and limitations of the Windows FINDSTR command? Daher wäre es besser, die Validierung verwenden regulärer Ausdruck:

^[][]*$ 

Diesen Ausdruck nicht so kompakt wie ^[0-9][0-9]*$ aussieht, aber ist besser für die Benutzereingabevalidierung .

Bitte beachten Sie, dass selbst wenn die Benutzereingabe diesen Test besteht, die eingegebene Zahlenfolge für die weitere Verarbeitung in einem arithmetischen Ausdruck ungültig sein könnte, z. B. wenn der Benutzer 45829413953053 eingibt. Diese Zahl ist zu groß für eine 32-Bit-Ganzzahl mit Vorzeichen, die nur Zahlen im Bereich -2147483648 bis 2147483647 unterstützt.

Verwandte Themen