首页 > 解决方案 > 如何批量进行负正则表达式匹配?

问题描述

这一次,我无法为我之前的帖子创建 if 语句

我正在尝试检查该值是否采用这种形式:^\d\d\.\d$

大多数时候,它会的。但是,它有时不可用。

在其他脚本语言中,我可以管理它,但由于某些未知原因,我无法弄清楚如何批量处理。

所以,它应该是这样的:

if not findstr /R "^\d\d\.\d$" %newvalue%
set newvalue=

如果不是"^\d\d\.\d$",则设置为newvalue空白。这只是在newvalue找不到时才空白,因为它会给出随机结果。

有人可以帮帮我吗?做这个if声明的最佳方法是什么?

提前致谢。

标签: regexbatch-file

解决方案


LotPings发布的非常好的工作解决方案是:

Echo:%newvalue%|findstr "^[0-9][0-9]\.[0-9]$" >Nul 2>&1 &&(echo matched pattern)||(echo didn't match pattern)

我建议有点不同的单行解决方案:

echo:%newvalue%|%SystemRoot%\System32\findstr.exe /R "^[0123456789][0123456789]\.[0123456789]$" >nul && (echo matched pattern) || (echo didn't match pattern)

或者更易于阅读并适用于分配给环境变量的任何字符串值newvalue

setlocal EnableExtensions EnableDelayedExpansion
echo:!newvalue!| %SystemRoot%\System32\findstr.exe /R "^[0123456789][0123456789]\.[0123456789]$" >nul
if errorlevel 1 (
    echo Value does not match the regular expression pattern.
) else (
    echo Value matches the regular expression pattern.
)
endlocal

echo在命令和分配给环境变量的字符串之间使用冒号newvalue而不是空格,以避免命令ECHOnewvalue在根本未定义的情况下输出命令回显的当前状态。

最后一个解决方案使用延迟扩展来避免带有ECHOFINDSTR的命令行不起作用或执行与分配给变量的字符串newvalue包含类似&<>|.

重要的是没有空间留给重定向操作符|,该操作符将命令ECHO的输出传递给命令FINDSTR作为输入,因为这个空格字符也将由命令ECHO输出,并且正则表达式 find 永远不会是正数。如上一个示例所示,空格权限|无关紧要。

FINDSTR不支持\d作为任何数字的表示。需要在方括号中的自定义字符类中指定要匹配的字符。FINDSTR[0-9]字符匹配0123456789¹²³。必须使用[0123456789]仅匹配0123456789没有. 的字符¹²³

.表示任何字符,除了点用反斜杠转义,在这种情况下它被解释为文字字符。

默认情况下, FINDSTR将搜索字符串"..."解释为正则表达式字符串。但我认为,对于FINDSTR和每个读者来说,使用或使其 100% 清晰总是好的,搜索字符串应该如何解释为文字或正则表达式字符串。/L/R

FINDSTR1在搜索的输入字符流上没有正匹配并且0至少有一个正匹配时退出。FINDSTR的退出代码可以如上所示进行评估,并使用 Windows 批处理文件在单行中详细描述多个命令

FINDSTR对正匹配的输出不感兴趣,因此重定向到设备NUL以抑制它。

要了解使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • findstr /?
  • if /?
  • setlocal /?

另请参阅有关使用命令重定向运算符和 DosTips 论坛主题ECHO 的 Microsoft 文章。无法提供文本或空行 - 而是使用 ECHO/,因为使用:afterecho通常比从文件读取或用户输入的字符串的输出中留出空格更好。


推荐阅读