为什么2次[0-9]比一次好?

时间:2017-09-17 17:39:34

标签: regex batch-file

问题 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]写了两次?

1 个答案:

答案 0 :(得分:2)

在命令提示符窗口findstr /?中执行输出此命令的帮助。

搜索正则表达式意味着:

  • ^ ...在行的开头找到一个字符串
  • [0-9] ...至少有一位数字
  • [0-9]* ...并且可以包含 0或更多位数
  • $ ...并在该行的末尾结束。

换句话说, ECHO 输出的行必须包含1位或更多位数字,并且没有其他字符用于与分配给环境变量0的退出代码ERRORLEVEL的正匹配。输出行上的任何其他字符串都不会导致匹配并退出代码1

需要第一个[0-9]以确保用户输入至少包含1位数字。否则空行也会产生正匹配。 FINDSTR 不支持乘数+,在其他具有正则表达式支持的应用程序中,乘数意味着 1或更多以前的字符或字符类或表达式。

好吧,未定义的userinput会导致输出ECHO is OFFECHO 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范围内的数字。