Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在这些情况下限制破折号的正则表达式模式 脚本_Regex_Delphi_Pattern Matching_Filenames_Pascalscript - Fatal编程技术网

Regex 在这些情况下限制破折号的正则表达式模式 脚本

Regex 在这些情况下限制破折号的正则表达式模式 脚本,regex,delphi,pattern-matching,filenames,pascalscript,Regex,Delphi,Pattern Matching,Filenames,Pascalscript,我正在使用一个第三方文件重命名软件,该软件是用Delphi编写的,具有pascal脚本支持: 该应用程序允许使用正则表达式重命名文件。这意味着,如果我需要对文件名执行的操作不能仅使用一个正则表达式来完成,那么我可以同时使用各种表达式或pascal脚本代码来容纳文件名,直到我能够正确格式化文件名以满足此问题或其他任何需要 问题 我需要像下面这样格式化歌曲文件名,在这些文件名中“…特色艺术家”部分位于字符串的右侧,我需要匹配该部分并将其定位在字符串的左侧 Carbin&Sirmark-抱歉的壮举。

我正在使用一个第三方文件重命名软件,该软件是用Delphi编写的,具有pascal脚本支持:

该应用程序允许使用正则表达式重命名文件。这意味着,如果我需要对文件名执行的操作不能仅使用一个正则表达式来完成,那么我可以同时使用各种表达式或pascal脚本代码来容纳文件名,直到我能够正确格式化文件名以满足此问题或其他任何需要

问题 我需要像下面这样格式化歌曲文件名,在这些文件名中“…特色艺术家”部分位于字符串的右侧,我需要匹配该部分并将其定位在字符串的左侧

  • 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屁股洞
然后,如果我错了,请纠正我,但我认为这是不可能以任何方式解决的,因为机器无法预测何时将一个标记与另一个标记分开,名称是什么或不是什么,因为我不知道包含文件名的破折号数

出于这个原因,与其寻找可能导致坏结果的ingenuos完美 由于文件名中有大量破折号,我更喜欢查找 文件名排除解决方案,通过限制表达式包含的破折号 应该在文件名中匹配

问题: 以我在上面展示的用于扩展/改进它的正则表达式为例,如何排除包含
[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屁股洞'
  • 致:“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.