如何批量进行正则表达式否定匹配?

时间:2018-12-31 14:46:19

标签: regex batch-file

这次,我无法为之前的post

创建if语句

我正在尝试检查该值是否采用以下格式:^\d\d\.\d$

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

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

因此,它应该类似于:

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

如果不是"^\d\d\.\d$",则将newvalue设置为空白。只会在找不到newvalue时将其留空,因为它将产生随机结果。

有人可以帮我吗?进行此if语句的最佳方法是什么?

谢谢。

1 个答案:

答案 0 :(得分:1)

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

- (NSUUID *)reportOutgoingCallContactIdentifier:(NSString *)identifier destination:(NSString *)name telNumber:(NSString *)telnum 

我建议使用其他一些单线解决方案:

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的字符串之间使用冒号代替空格,以避免该命令 ECHO 输出命令回显的当前状态。根本没有定义newvalue的大小写。

最后一个解决方案使用delayed expansion来避免带有 ECHO FINDSTR 的命令行不起作用,或者执行与以下命令完全不同的操作分配给变量newvalue的字符串包含类似newvalue的运算符。

重要的是,重定向操作符&<>|上应留有空间,因为该空间会将命令 ECHO 的输出通过管道传递给命令 FINDSTR 作为输入字符 ECHO 也将输出,并且正则表达式find永远不会为正。如上例所示,对|的空格权利并不重要。

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

¹²³表示任何字符,除了点用反斜杠转义以外,在这种情况下将其解释为文字字符。

默认情况下, FINDSTR .中的搜索字符串解释为正则表达式字符串。但是我认为,最好使用"..."/L使 FINDSTR 以及每个阅读器如何100%清晰地理解搜索字符串,作为文字或正则表达式字符串。

FINDSTR 会在搜索到的输入字符流上没有正向匹配时以值/R退出,而在至少一个正向匹配时以1退出。可以如上所述评估 FINDSTR 的退出代码,并在single line with multiple commands using Windows batch file中进行详细说明。

在正匹配项上的 FINDSTR 的输出没有意义,因此重定向到设备 NUL 对其进行抑制。

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

  • 0
  • echo /?
  • endlocal /?
  • findstr /?
  • if /?

另请参阅有关Using command redirection operators和DosTips论坛主题ECHO. FAILS to give text or blank line - Instead use ECHO/的Microsoft文章,原因是在setlocal /?之后使用:通常比在字符串输出上使用空格更好从文件读取或由用户输入。