问题 Batch File input validation - Make sure user entered an integer ,有这样的答案:
You can also use a quite simple trick:
echo %userinput%|findstr /r /c:"^[0-9][0-9]*$" >nul
if errorlevel 1 (echo not a number) else (echo number)
This uses findstr's regular expression matching capabilities. They aren't very impressive but useful at times.
我的问题 - 为什么 [0-9]
写了两次?
最佳答案
在命令提示符窗口中执行 findstr/?
会输出该命令的帮助。
搜索正则表达式的意思是:
^
...在行首查找字符串[0-9]
...至少有 1 位数字[0-9]*
...并且可以有0个或更多数字$
...并在行尾结束。
换句话说,ECHO 输出的行必须具有 1 个或多个数字,并且没有其他字符,才能与分配给环境变量 的退出代码
0
进行正匹配错误级别。输出行上的任何其他字符串都会导致不匹配并退出代码 1
。
需要第一个 [0-9]
以确保用户输入至少包含 1 位数字。否则空行也会导致正匹配。 FINDSTR 不支持乘数 +
,在其他支持正则表达式的应用程序中,乘数表示1 个或更多 先前的字符或字符类或表达式。 p>
好吧,未定义的用户输入
将导致输出ECHO is OFF
或ECHO is ON
由FINDSTR处理strong> 如果在 set/P "userinput=prompt text: "
之前未定义 userinput
并且用户只需按 RETURN 或 ENTER 。因此,^[0-9]*$
也可能在这里工作,因为这里不会发生 FINDSTR 必须处理空行的情况。
但是FINDSTR有一些意外的匹配行为。例如,[0-9]
还匹配 1
和 2
和 3
,具体取决于 Windows-1252 等代码页,参见 What are the undocumented features and limitations of the Windows FINDSTR command? 因此最好用作验证正则表达式:
^[0123456789][0123456789]*$
该表达式看起来不像 ^[0-9][0-9]*$
那么紧凑,但更适合用户输入验证。
请注意,即使用户输入通过了此测试,输入的数字字符串对于算术表达式中的进一步处理也可能无效,例如,如果用户输入 45829413953053
。对于仅支持 -2147483648
到 2147483647
范围内的数字的 32 位有符号整数来说,此数字太大。
关于regex - 为什么 2 次 [0-9] 比一次更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46267002/