首页 > 解决方案 > 如何获取与正则表达式模式不匹配的文件列表?

问题描述

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

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

例子:

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

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

此外,如果脚本可以将列表导出到 file ,那就太棒了C:\temp\DoesNotMatch.txt

标签: regexwindowsbatch-file

解决方案


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 文章。

FINDSTR运行不区分大小写,因为/I正则表达式搜索,因为/Rfor 匹配在双引号中指定的表达式与 option的行/C:,并输出反转结果,因为 option/V表示正则表达式不匹配字符串的行。

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

正则表达式搜索字符串看起来有点奇怪,因为FINDSTR支持的正则表达式语法非常有限。在命令提示符窗口findstr /?中运行以获取有关此命令及其选项和正则表达式支持的帮助。我建议另外阅读SS64 - FINDSTRWindows FINDSTR 命令有哪些未记录的功能和限制?

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

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

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

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

[A-Z]可以使用,但也匹配很多其他字符,比如ÄäÖöÜü这里只列出几个。所以最好[ABCDEFGHIJKLMNOPQRSTUVWXYZ]只匹配不区分大小写的 ASCII 字符。

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


推荐阅读