regex - 如何获取与正则表达式模式不匹配的文件列表?
问题描述
我需要帮助创建一个 Windows 批处理脚本来列出给定目录中与此正则表达式不匹配的文件:
^[0-9]{5}\s[A-Z].*$
例子:
输出应该是文件名:ABC_12345.txt
and123456-ABC.pdf
和1234 NO.doc
.
12345 ABC.txt
但是批处理脚本不应该输出文件名。
此外,如果脚本可以将列表导出到 file ,那就太棒了C:\temp\DoesNotMatch.txt
。
解决方案
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
正则表达式搜索,因为/R
for 匹配在双引号中指定的表达式与 option的行/C:
,并输出反转结果,因为 option/V
表示正则表达式不匹配字符串的行。
/C:"..."
此处必须使用该选项来指定要解释的字符串,因为/R
它是正则表达式而不是文字字符串,否则仅"..."
使用空格字符将被解释为两个正则表达式搜索字符串之间的分隔符,这将在每一行上应用 OR。
正则表达式搜索字符串看起来有点奇怪,因为FINDSTR支持的正则表达式语法非常有限。在命令提示符窗口findstr /?
中运行以获取有关此命令及其选项和正则表达式支持的帮助。我建议另外阅读SS64 - FINDSTR和Windows 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
中,如果在使用这个单一命令行执行批处理文件时已经存在,则该文件将被覆盖。
推荐阅读
- haskell - 如何在 Haskell 中为 IO 专门化 mapM
- gatling - Gatling:响应时间百分位数和延迟百分位数随时间的差异
- java - Libgdx 播放/暂停音乐
- android - 避免按下后退按钮时关闭 AlertDialog
- regex - 将正则表达式从 pcre 转换为 sed 以拆分字符串
- c++ - 某些输入的基数排序实现失败
- kubernetes - 取消或撤消删除 Kubernetes 集群中的 Persistent Volumes
- python-3.x - 如何使用机器学习或预测来解决 Python 3 中的这种回归?
- python - Pandas:按两列分组,并以 LONG 格式查找 3 列的第 25、中位数、第 75 个百分位数和平均值
- ffmpeg - ffmpeg demux into audio 和 video 重置 PTS