Google Drive迁移至OneDrive失败,求匹配文件名中间点的正则(排除扩展名)
解决方案:匹配文件名中间的点(排除扩展名)
可以用正则表达式精准匹配文件名中间的点,同时排除扩展名前的最后一个点,以下是具体实现:
核心正则表达式
(?<!^)\.(?!\w+$)
正则逻辑解释
(?<!^):反向预查,确保匹配的点不在文件名开头(避免误匹配.bashrc这类隐藏文件的起始点)\.:匹配实际的点字符(需转义,因为.在正则里是通配符)(?!\w+$):正向预查,确保点后面不是连续的字母数字直到字符串结尾——也就是排除扩展名(比如.pdf、.docx)前的那个点
匹配效果示例
针对你提到的文件名 Acuse.GASP8409257P9.6.2021.pdf,这个正则会匹配前三个点(即 .GASP、.6、.2021 中的点),完全忽略最后一个 .pdf 里的点。
其他测试案例:
Report.Q3.2024.docx:匹配前两个点,忽略最后一个.docx的点.config.file.txt:匹配.file里的点,忽略开头的隐藏文件标识点和最后一个.txt的点Notes.v2.md:匹配.v2里的点,忽略最后一个.md的点
批量替换建议
如果需要把这些中间点替换成其他字符(比如下划线 _),可以在支持正则替换的工具或脚本中使用以下方式:
示例1:Notepad++ 批量替换
- 打开文件名列表,按下
Ctrl+H调出替换窗口 - 勾选「正则表达式」选项
- 查找内容填
(?<!^)\.(?!\w+$),替换为填_ - 点击「全部替换」即可
示例2:PowerShell 批量重命名文件
# 递归遍历当前目录下的所有文件/文件夹 Get-ChildItem -Recurse | Where-Object { $_.Name -match '(?<!^)\.(?!\w+$)' } | ForEach-Object { # 将匹配到的中间点替换为下划线 $newName = $_.Name -replace '(?<!^)\.(?!\w+$)', '_' # 执行重命名(建议先加 -WhatIf 参数测试效果,确认无误后再移除) Rename-Item -Path $_.FullName -NewName $newName -WhatIf }
注意:运行批量重命名命令前,一定要加
-WhatIf参数预览修改效果,避免误操作。
特殊场景调整
如果你的文件存在多层扩展名(比如 archive.tar.gz),且希望保留这类多层扩展名里的中间点,可以改用以下正则:
\.(?=.*\.)
这个正则会匹配后面还有至少一个点的点,刚好排除最后一个点,不管扩展名有几层。比如 file.tar.gz 里只会匹配 .tar 里的点,.gz 不会被匹配;file.name.pdf 里只会匹配 .name 里的点,.pdf 不会被匹配。
内容的提问来源于stack exchange,提问作者Mark Fraher
相关产品推荐
相关产品推荐

