You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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++ 批量替换

  1. 打开文件名列表,按下 Ctrl+H 调出替换窗口
  2. 勾选「正则表达式」选项
  3. 查找内容填 (?<!^)\.(?!\w+$),替换为填 _
  4. 点击「全部替换」即可

示例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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 21:17:30