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

标签 regex batch-file

问题 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 OFFECHO is ONFINDSTR处理strong> 如果在 set/P "userinput=prompt text: " 之前未定义 userinput 并且用户只需按 RETURNENTER 。因此,^[0-9]*$ 也可能在这里工作,因为这里不会发生 FINDSTR 必须处理空行的情况。

但是FINDSTR有一些意外的匹配行为。例如,[0-9] 还匹配 123,具体取决于 Windows-1252 等代码页,参见 What are the undocumented features and limitations of the Windows FINDSTR command? 因此最好用作验证正则表达式:

^[0123456789][0123456789]*$

该表达式看起来不像 ^[0-9][0-9]*$ 那么紧凑,但更适合用户输入验证。

请注意,即使用户输入通过了此测试,输入的数字字符串对于算术表达式中的进一步处理也可能无效,例如,如果用户输入 45829413953053。对于仅支持 -21474836482147483647 范围内的数字的 32 位有符号整数来说,此数字太大。

关于regex - 为什么 2 次 [0-9] 比一次更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46267002/

相关文章:

regex - 打印Powershell Regex捕获到输出文件

c# - 使用正则表达式 C# 在两个字符串的 block 中获取文本文件的多行字符串

python - 使用正则表达式进行哈希表/字典/ map 查找

regex - htaccess重写规则3变量

batch-file - 为什么我得到 "ECHO is OFF/ON"?

windows - 从文件中读取值并将其分配给批处理脚本中的变量

asp.net - 检查文本框文本是否为 6 个或更多字符长的 RegularExpressionValidator 上的表达式是什么?

windows - 将文本文件中的字符串提取到另一个文本文件中?在.bat中

python - 跨平台部署,安装方便

windows - "findstr"Windows 命令排除评论中的搜索