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

时间:2018-08-29 21:06:47

标签: regex windows batch-file

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

std::variant

示例:

输出应为文件名:^[0-9]{5}\s[A-Z].*$ ABC_12345.txt123456-ABC.pdf

但是批处理脚本不应输出文件名1234 NO.doc

此外,如果脚本可以将列表导出到文件12345 ABC.txt中,那将会很棒。

1 个答案:

答案 0 :(得分: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 。有关详细信息,请阅读Microsoft关于Using command redirection operators的文章。

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

此处必须使用选项/C:"..."来指定要解释的字符串,因为/R是正则表达式,而不是原义字符串,否则将仅使用"..."来解释空格字符作为两个正则表达式搜索字符串之间的分隔符,它们将在每行上进行或运算。

由于 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中,如果在使用此单个命令行执行批处理文件时已经存在该文件,则该文件将被覆盖。 / p>