正则表达式 - 将文件重命名为文件名中的最高分辨率

Posted

技术标签:

【中文标题】正则表达式 - 将文件重命名为文件名中的最高分辨率【英文标题】:Regex - Renaming file to highest resolution in filename 【发布时间】:2020-05-24 09:43:13 【问题描述】:

我正在使用名为 Advanced Renamer 的应用程序来重命名我的视频文件。我尝试通过选择可用的最高质量来重命名视频文件,这是在当前文件名本身中指定的。

例如,原始未更改的文件名如下所示:1080P,720P,480P,240P,_123456789.mp4

我正在使用正则表达式将此示例文件重命名为:1080P_123456789.mp4

但是,我现在使用的正则表达式的结果 .*(?=1080P|720P|480P|240P) 无法正常工作,它采用的是最低质量而不是最高质量:240P,_123456789.mp4

正确的例子:

1080P,720P,480P,240P,_0987654321.mp4  --> 1080P_0987654321.mp4
720P,480P,_0987654321.mp4             --> 720P_0987654321.mp4
480P,240P,_0987654321.mp4             --> 480P_0987654321.mp4

我的正则表达式给了我错误的例子:

1080P,720P,480P,240P,_0987654321.mp4  --> 240P_0987654321.mp4
720P,480P,_0987654321.mp4             --> 480P_0987654321.mp4
480P,240P,_0987654321.mp4             --> 240P_0987654321.mp4

编辑:解决方案

^.*?(1080P|720P|480P|240P).*?(_\d+\.mp4).*$
OR 
^.*?(\d+P).*?_(\d+\.mp4)\S*
OR
.*?(\d+P)[^.]*_(\d+\.mp4)\S*

【问题讨论】:

【参考方案1】:

试试这个^(1080P|720P|480P|240P).*,(.*)^ 将匹配该行中的第一次出现。

【讨论】:

感谢您的评论。我在@thefourthBird 的回答下方回复了 我在@TheFourthBird 的答案下方发表了我的评论。感谢您发布解决方案!【参考方案2】:

对于当前的示例数据,您可以捕获捕获组中的第一次出现,因为它是最高值。

然后匹配除下划线以外的任何字符,然后使用否定字符类后跟下划线以确保它存在。

\b(\d+P)\b[^_]*_

说明

\b字边界 (\d+P) 捕获组 1,匹配 1+ 个数字和 P \b字边界 [^_]*_ 匹配除_ 之外的任何字符0+ 次,然后匹配_

Regex demo

在替换中使用第一个捕获组,后跟匹配的下划线,该下划线是匹配的一部分,但不存在于捕获组中。


如果您还想删除数字和P 之前和.mp4 之后的特定数字:

^.*?(1080P|720P|480P|240P).*?(_\d+\.mp4).*$

Regex demo

在替换中使用两个捕获组$1$2

【讨论】:

感谢您和@eraklon 的回复!两个答案都有效,但如果在分辨率之前和文件扩展名之后还有更多字符怎么办?然后两个答案都不起作用,所以我试图混合两个正则表达式来得到我想要的,但没有运气。也许有人可以看到这个正则表达式有什么问题,因为我看不到它。 regex101.com/r/2ccGgb/5 @Johanthan 你是这个意思吗? .*?(\d+P)[^.]*_(\d+\.mp4)\S*regex101.com/r/JNlOzX/1或者这样^.*?(\d+P).*?_(\d+\.mp4)\S*regex101.com/r/GkGuuj/1 @Johanthan 请注意,单词边界\b 在数字和下划线之间不匹配。我已经更新了答案。 非常感谢你们,你们都发布了正确的解决方案!我已经更新了我的第一篇文章并添加了解决方案。你们发布的三个正则表达式正在工作。非常感谢,也感谢您的快速回复! 很高兴我们能帮上忙! :)

以上是关于正则表达式 - 将文件重命名为文件名中的最高分辨率的主要内容,如果未能解决你的问题,请参考以下文章

rename命令中正则表达式的使用

使用正则表达式重命名文件名

正则表达式和 unicode

如何快速重命名文件夹中的一堆文件

用一个实例讲解rename命令中正则表达式的使用

将文件夹中的文件重命名为序号