如何获取与正则表达式模式不匹配的文件列表?

问题描述 投票:1回答:1

我需要帮助创建一个Windows批处理脚本,用于列出与给定目录中的此正则表达式不匹配的文件:

^[0-9]{5}\s[A-Z].*$

例:

输出应该是文件名:ABC_12345.txt123456-ABC.pdf1234 NO.doc

但是批处理脚本不应输出文件名12345 ABC.txt

此外,如果脚本可以将列表导出到文件C:\temp\DoesNotMatch.txt,那将是非常棒的。

regex windows batch-file
1个回答
1
投票

FINDSTR可用于过滤DIR的输出以获取所需列表:

@dir /A-D /B | %SystemRoot%\System32\findstr.exe /I /R /V /C:"^[0123456789][0123456789][0123456789][0123456789][0123456789] [ABCDEFGHIJKLMNOPQRSTUVWXYZ]" >C:\temp\DoesNotMatch.txt

DIR输出因为/A-D只是文件(属性而不是目录)在当前目录中的裸格式,因为选项/B这意味着只有文件扩展名,但没有文件路径。在命令提示符窗口dir /?中运行以获取有关此命令及其选项的帮助。

DIR的输出通过重定向运算符|重定向到FINDSTR。有关详细信息,请阅读有关Using command redirection operators的Microsoft文章。

FINDSTR运行不区分大小写,因为/I是正则表达式搜索,因为/R用于匹配双引号中指定的表达式与选项/C:的行,并且由于选项/V输出反转结果,这意味着正则表达式不匹配任何字符串的行。

这里必须使用选项/C:"..."来指定被解释的字符串,因为/R是正则表达式而不是文字字符串,否则仅使用"..."空格字符将被解释为两个正则表达式搜索字符串之间的分隔符,这些字符串将在每个字符串上应用OR线。

正则表达式搜索字符串看起来有点奇怪,因为FINDSTR支持的正则表达式语法非常有限。在命令提示符窗口findstr /?中运行以获取有关此命令及其选项和正则表达式支持的帮助。我建议另外阅读SS64 - FINDSTRWhat are the undocumented features and limitations of the Windows FINDSTR command?

^ ...表示由于没有文件路径输出而导致文件名开头的行的开头。

可以使用[0-9],但也匹配¹²³。出于这个原因,[0123456789]用于真正匹配那些10位数字中的任何一个。

FINDSTR不支持像{5}这样的乘数。因此,有必要在搜索表达式中将数字字符类定义写入五次。

FINDSTR不支持根据Unicode标准匹配任何空白字符的字符类\s。但是文件名中不允许使用垂直空格或非常不寻常,文件名中不允许使用水平制表符,文件名中可以​​使用不间断空格,但也不常见。 Unicode代码值U + 1680,U + 180E,U + 2000到U + 2008的特殊字符很可能也从未在文件名中使用过。所以\s可以用普通的空格字符代替。

可以使用[A-Z],但也匹配许多其他字符,如ÄäÖöÜü,在这里列出一些。因此,最好使用[ABCDEFGHIJKLMNOPQRSTUVWXYZ]来匹配不区分大小写的ASCII字符。

使用>将FINDSTR的输出重定向到文件C:\temp\DoesNotMatch.txt中,如果已经使用此单个命令行执行批处理文件,则会覆盖该文件。

© www.soinside.com 2019 - 2024. All rights reserved.