Regex语法\(.*\)能否移除文件名括号及内部内容?其工作原理是什么?
正则匹配批量重命名问题解答
- 你提到的
\(.*\)写法,在你给出的两个标准示例文件名上,确实能匹配到需要删除的带括号时间戳内容,但这个写法存在很严重的误匹配隐患,完全不适合批量文件处理场景使用。
\(.*\)的实际匹配逻辑
逐段拆解规则的运行逻辑:
\(:转义匹配字面量左圆括号(。正则语法中圆括号本身是标记捕获组的特殊元字符,前面加反斜杠转义后,就不再承担语法功能,只会匹配文本中真实存在的(字符。.*:核心匹配段:.是通用通配符,默认可以匹配除换行符外的任意单个字符*是贪婪量词,代表前面的匹配规则(即通配符.)可以连续匹配0次到任意多次,匹配过程中会尽可能向后延伸,匹配最长的符合规则的内容。
\):和开头的\(对应,转义匹配字面量右圆括号)。
这个写法的致命问题来自
.*的贪婪匹配特性:如果文件名中出现了额外的圆括号,匹配范围会直接失控。比如文件名为项目说明(终稿)(2021-12-05-14-51-25_UTC).jpg时,\(.*\)会从第一个左括号(开始匹配,一直吞到最后一个右括号),把(终稿)(2021-12-05-14-51-25_UTC)整段选中,替换后只会得到项目说明.jpg,本该保留的(终稿)字段会被一起删掉。
适配你需求的稳妥正则方案
结合你描述的规则——待删除括号块固定在扩展名前面,右括号后紧跟扩展名前的点号,可以用更精准的规则完全避免误匹配:
- 固定格式适配(最稳妥,完全匹配你说的UTC时间戳格式):
\(\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}_UTC\)(?=\.)
这个规则只会精准匹配(4位年-2位月-2位日-2位时-2位分-2位秒_UTC)格式的内容,同时通过正向预查要求匹配内容后面必须紧跟.,完全不会误碰文件名其他位置的括号内容。 - 通用适配(不限制括号内内容,仅匹配扩展名前的最后一个括号块):
\([^()]*\)(?=\.[^.]+$)
这个规则用[^()]*替代了.*,只会匹配一对不嵌套其他括号的完整圆括号内容,同时限定这个括号块必须在最后一个文件扩展名之前,不会出现跨括号长匹配的问题。
你给出的两个示例文件名,用上面两个规则把匹配到的内容替换为空后,都能得到预期结果:
IMG523314(2021-12-05-14-51-25_UTC).jpg→IMG523314.jpgTest run1(2021-08-05-11-32-18_UTC).txt→Test run1.txt
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

