问题 Batch File input validation - Make sure user entered an integer ,有这个答案:
您还可以使用一个非常简单的技巧:
echo %userinput%|findstr /r /c:"^[0-9][0-9]*$" >nul
if errorlevel 1 (echo not a number) else (echo number)
这使用了findstr的正则表达式匹配功能。它们不是很令人印象深刻但有时很有用。
我的问题 - 为什么[0-9]
写了两次?
答案 0 :(得分:2)
在命令提示符窗口findstr /?
中执行输出此命令的帮助。
搜索正则表达式意味着:
^
...在行的开头找到一个字符串[0-9]
...至少有一位数字[0-9]*
...并且可以包含 0或更多位数$
...并在该行的末尾结束。换句话说, ECHO 输出的行必须包含1位或更多位数字,并且没有其他字符用于与分配给环境变量0
的退出代码ERRORLEVEL
的正匹配。输出行上的任何其他字符串都不会导致匹配并退出代码1
。
需要第一个[0-9]
以确保用户输入至少包含1位数字。否则空行也会产生正匹配。 FINDSTR 不支持乘数+
,在其他具有正则表达式支持的应用程序中,乘数意味着 1或更多以前的字符或字符类或表达式。
好吧,未定义的userinput
会导致输出ECHO is OFF
或ECHO is ON
由 FINDSTR 处理,如果userinput
未定义{ {1}}用户只需点击 RETURN 或 ENTER 。出于这个原因,set /P "userinput=prompt text: "
也可能偶然在这里工作,因为 FINDSTR 不得在此处理空行。
但是 FINDSTR 有一些意想不到的匹配行为。例如,^[0-9]*$
也匹配[0-9]
以及¹
和²
,具体取决于Windows-1252之类的代码页,请参阅What are the undocumented features and limitations of the Windows FINDSTR command?因此,最好将其用作验证正则表达式:
³
该表达式看起来不像^[0123456789][0123456789]*$
那样紧凑,但更适合用户输入验证。
请注意,即使用户输入通过了此测试,输入的数字字符串也可能无效,无法在算术表达式中进一步处理,例如,如果用户输入^[0-9][0-9]*$
。对于32位有符号整数,此数字太大,仅支持45829413953053
到-2147483648
范围内的数字。