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

如何用Matlab/Octave regexprep给文件名扩展名前加后缀(无扩展名时末尾加)

哈哈,这个正则坑我之前也踩过!想要只给最后一个扩展名前加_old,同时兼容无扩展名的情况,用正向预查+结尾匹配就能完美解决~

最终解决方案

直接用这行命令就能覆盖所有情况:

new_filename = regexprep(filename, '\.(?=[^.]*$)|$', '_old$0');

正则逻辑拆解

咱们来掰扯清楚每个部分为啥这么写:

  • \.(?=[^.]*$):匹配最后一个点
    • \.:匹配一个点字符(转义是因为点在正则里是通配符)
    • (?=[^.]*$):正向预查,确保这个点后面没有其他点([^.]*匹配任意非点字符,$锚定到字符串结尾)
  • |$:或者匹配字符串的结尾(专门处理无扩展名的情况)
  • 替换字符串_old$0:$0代表正则匹配到的内容
    • 如果匹配到最后一个点,就替换成_old.
    • 如果匹配到字符串结尾,就直接追加_old

测试案例验证

给几个常见场景的测试,确保没问题:

% 场景1:带多层扩展名的文件名
filename1 = 'my.file.ext';
result1 = regexprep(filename1, '\.(?=[^.]*$)|$', '_old$0');
% 输出:'my.file_old.ext'

% 场景2:无扩展名的文件名
filename2 = 'myfile';
result2 = regexprep(filename2, '\.(?=[^.]*$)|$', '_old$0');
% 输出:'myfile_old'

% 场景3:文件名以点结尾(比如未完成的扩展名)
filename3 = 'myfile.';
result3 = regexprep(filename3, '\.(?=[^.]*$)|$', '_old$0');
% 输出:'myfile_old.'

为啥你之前的命令不行?

你之前用的regexprep(filename, '\.', '_old.')会匹配所有的点,所以每个点都会被替换成_old.,自然就得到了my_old.file_old.ext这种不符合预期的结果。咱们通过正向预查给正则加了“只匹配最后一个点”的限制,就解决了这个问题~

内容的提问来源于stack exchange,提问作者Felipe Jiménez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 20:08:14