Regex 在这些情况下限制破折号的正则表达式模式 脚本
我正在使用一个第三方文件重命名软件,该软件是用Delphi编写的,具有pascal脚本支持: 该应用程序允许使用正则表达式重命名文件。这意味着,如果我需要对文件名执行的操作不能仅使用一个正则表达式来完成,那么我可以同时使用各种表达式或pascal脚本代码来容纳文件名,直到我能够正确格式化文件名以满足此问题或其他任何需要 问题 我需要像下面这样格式化歌曲文件名,在这些文件名中“…特色艺术家”部分位于字符串的右侧,我需要匹配该部分并将其定位在字符串的左侧Regex 在这些情况下限制破折号的正则表达式模式 脚本,regex,delphi,pattern-matching,filenames,pascalscript,Regex,Delphi,Pattern Matching,Filenames,Pascalscript,我正在使用一个第三方文件重命名软件,该软件是用Delphi编写的,具有pascal脚本支持: 该应用程序允许使用正则表达式重命名文件。这意味着,如果我需要对文件名执行的操作不能仅使用一个正则表达式来完成,那么我可以同时使用各种表达式或pascal脚本代码来容纳文件名,直到我能够正确格式化文件名以满足此问题或其他任何需要 问题 我需要像下面这样格式化歌曲文件名,在这些文件名中“…特色艺术家”部分位于字符串的右侧,我需要匹配该部分并将其定位在字符串的左侧 Carbin&Sirmark-抱歉的壮举。
- Carbin&Sirmark-抱歉的壮举。Sevener
- Kristjan现金-带我回家壮举。Bebe Rexha(撤销混音)
[0]ARTIST [1]DASH [2]TRACK [3]FEAT_ARTIST [4]POSSIBLE_ADDITIONAL_INFO_INSIDE:()[]{}
然后,我需要对正则表达式执行的是格式化文件名,以便按以下顺序定位标记:
[0]ARTIST [3]FEAT_ARTIST [1]DASH [2]TRACK [4]POSSIBLE_ADDITIONAL_INFO_INSIDE:()[]{}
实际上,我使用这个正则表达式:
\一个([^-]?)\s-\s*(.?)\s([([])?(([)))(英尺[.\s]|专长[.\s]|特色[.]s])[^(){}[]]*([)]])(.+)?\Z
替换为:
$1$4-$2$7
问题从这里开始,因为[0]艺术家
和[2]曲目
标记可能包含破折号,例如此文件名:
// Formats an audio filename that has the "...featuring artist" part at the end of filename.
//------------------------------------------------------------------------------------------
// Pseudo-Example:
//
// From: [0]ARTIST_NAME [1]DASH [2]TRACK_TITLE [3]FEAT_ARTIST [4]POSSIBLE_ADDITIONAL_INFO_INSIDE:()[]{}
// To: [0]ARTIST_NAME [3]FEAT_ARTIST [1]DASH [2]TRACK_TITLE [4]POSSIBLE_ADDITIONAL_INFO_INSIDE:()[]{}
// Real-Example:
//
// From: Carbin & Sirmark - Sorry Feat. Sevener.mp3
// To: Carbin & Sirmark Feat. Sevener - Sorry.mp3
// Known limitations:
//
// • If [0]ARTIST_NAME or [2]TRACK_TITLE parts contains any " - " the script will not work properlly.
// By default the script prevents any replacement on that kind of filenames, so don't worry.
var
rgxPattern: string;
rgxReplace: string;
dashCount: integer;
baseName: string;
extension: WideString;
begin
baseName := WideExtractBaseName(FileName)
extension := WideExtractFileExt(FileName);
// The regular expression that matches the filename parts.
// http://stackoverflow.com/questions/32807698/regex-pattern-to-limit-dashes-in-these-circumstances
rgxPattern := '^(.+)\s+-\s+(.+?)\s+[fF](t|eat(uring)?)?\.?([^([\])\n]+)(.+)?$'
rgxReplace := '$1 Feat.$5 - $2$6'
// The amount of " - " that contains the filename.
dashCount := high(MatchesRegEx(baseName, '\s-\s' , false));
// If only one " - " is found then...
If (dashCount = 0) Then
begin // Do the replacement.
baseName := ReplaceRegEx(baseName, rgxPattern, rgxReplace, false, true)
FileName := baseName + extension;
end;
end.
- Dj E-Energy C-21-我的超级英雄曲目!壮举Dj屁股洞
[0]艺术家
或带有破折号的[2]曲目
标记的文件名
…或者换句话说,当文件名在“…特色艺术家”部分之前包含多个破折号时,我如何告诉我的正则表达式避免修改文件名?(不在之后)
基本上,正则表达式应该确定是否在[3]专长艺术家
之前多次找到[1]破折号
,如果是,则排除该文件名(不要修改它)
我知道如何限制正则表达式组的出现,或多或少类似于这样的([\-]){1}
,以仅匹配一个破折号出现,但我不确定如何在我使用的表达式中实现它
预期结果 只是一些随机的例子 在
[3]专长艺术家
之前只需一个破折号,这样我们就可以知道何时将[0]艺术家
与[2]曲目
标记分开
- 来自:“卡宾和瑟马克-抱歉壮举。七分之一
- 致:'Carbin&Sirmark专长。Sevener-抱歉'
[3]专长艺术家
之前只需一个破折号,这样我们就可以知道何时将[0]艺术家
与[2]曲目
标记分开。里面有[4]可能的附加信息:()[]{}
- 来自:“飞行设施-心脏病发作壮举。猫头鹰眼(蛇臀混音)'
- 到:“飞行设施壮举。猫头鹰之眼-心脏病发作(蛇臀混音)'
[3]专长艺术家
之前只需一个破折号,这样我们就可以知道何时将[0]艺术家
与[2]曲目
标记分开。有[4]个可能的附加信息在里面:()[]{}
也包含破折号
- 来自:“飞行设施-心脏病发作壮举。猫头鹰之眼[蛇-臀混音]'
- 到:“飞行设施壮举。猫头鹰之眼-心脏病发作[蛇-臀部混音]'
[0]艺术家
和[2]曲目
标记之间划一个破折号,但文件名没有艺术家[3]专长,因此我们不会触摸它
- 来自:“Fedde Le Grand-电影”
- 致:“Fedde Le Grand-Cinematic”
[0]艺人
和[2]曲目
标记之间有一个破折号,但[3]艺人
的壮举在[1]破折号
之前,因此我们不会触摸它
- 来自:“Fedde Le Grand Feat。丹尼·怀特-电影化
- 致:“Fedde Le Grand Feat。丹尼·怀特-电影化
[0]艺术家
有破折号,因此我们不知道何时分离[0]艺术家
和[2]跟踪
标记,因此正则表达式应排除此标记以不修改此文件名
- 发件人:“艺人姓名-曲目名称专长某人”
- 致:“艺人名称-曲目名称壮举某人”
[2]曲目
有破折号,因此我们不知道何时将[0]艺术家
和[2]曲目
标记分开,因此正则表达式应排除此项,以避免修改此文件名
- 发件人:“艺人姓名-曲目名称专长某人”
- 致:“艺人名称-曲目名称壮举某人”
[0]ARTIST
和[2]TRACK
标记有破折号,因此我们不知道何时将它们分开,因此正则表达式应排除此项以不修改此文件名
- 来自:Dj E-Energy C-21-我的超级英雄曲目!壮举Dj屁股洞
[0]艺人
和[2]曲目
令牌有破折号,艺人[3]专长也有破折号
^(.+) - (.+?) ((?:featuring|feat\.?|ft\.?) +(?:[^\r\n (\[{]| (?![(\[{]))+)
$1 $3 - $2
Carbin & Sirmark Feat. Sevener - Sorry
Kristjan Cash Cash Feat. Bebe Rexha - Take Me Home (Revoke Remix)
Dj E-nergy C-21 feat Dj Ass-hole - My Super-hero track!
Flight Facilities Feat. Owl Eyes - Heart Attack (Snakehips Remix)
Flight Facilities Feat. Owl Eyes - Heart Attack [Snake--hips Remix]
Fedde Le Grand - Cinematic
Fedde Le Grand Feat. Denny White - Cinematic
Artist-Name feat someone - Track Name
Artist Name feat someone - Track-Name
Dj E-nergy C-21 feat Dj Ass-hole - My Super-hero track!
Dj E-nergy C-21 - My Super-hero track!
\A(.+) - (.+?) ((?:featuring|feat\.?|ft\.?) +(?:[^ (\[{]| (?![(\[{]))+)
$1 $3 - $2
^(.+) - (.+?) ((?:featuring|feat|ft)[ .]+(?:[^\r\n (\[{]| (?![(\[{]))+)
^((?:.(?! - ))+.) - ((?:.(?! - ))+) ((?:featuring|feat|ft)[ .]+(?:[^\r\n (\[{]| (?![(\[{]))+)
^(.+)\s+-\s+(.+?)\s+[fF](t|eat(uring)?)?\.?([^([\])\n]+)(.+)?$
// Formats an audio filename that has the "...featuring artist" part at the end of filename.
//------------------------------------------------------------------------------------------
// Pseudo-Example:
//
// From: [0]ARTIST_NAME [1]DASH [2]TRACK_TITLE [3]FEAT_ARTIST [4]POSSIBLE_ADDITIONAL_INFO_INSIDE:()[]{}
// To: [0]ARTIST_NAME [3]FEAT_ARTIST [1]DASH [2]TRACK_TITLE [4]POSSIBLE_ADDITIONAL_INFO_INSIDE:()[]{}
// Real-Example:
//
// From: Carbin & Sirmark - Sorry Feat. Sevener.mp3
// To: Carbin & Sirmark Feat. Sevener - Sorry.mp3
// Known limitations:
//
// • If [0]ARTIST_NAME or [2]TRACK_TITLE parts contains any " - " the script will not work properlly.
// By default the script prevents any replacement on that kind of filenames, so don't worry.
var
rgxPattern: string;
rgxReplace: string;
dashCount: integer;
baseName: string;
extension: WideString;
begin
baseName := WideExtractBaseName(FileName)
extension := WideExtractFileExt(FileName);
// The regular expression that matches the filename parts.
// http://stackoverflow.com/questions/32807698/regex-pattern-to-limit-dashes-in-these-circumstances
rgxPattern := '^(.+)\s+-\s+(.+?)\s+[fF](t|eat(uring)?)?\.?([^([\])\n]+)(.+)?$'
rgxReplace := '$1 Feat.$5 - $2$6'
// The amount of " - " that contains the filename.
dashCount := high(MatchesRegEx(baseName, '\s-\s' , false));
// If only one " - " is found then...
If (dashCount = 0) Then
begin // Do the replacement.
baseName := ReplaceRegEx(baseName, rgxPattern, rgxReplace, false, true)
FileName := baseName + extension;
end;
end.