如何用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
相关产品推荐
相关产品推荐

