所以,我试图制作一个程序来重命名一些文件。在大多数情况下,我希望它们看起来像这样,
[测试] StupidName - 2 [720p] .mkv
但是,如果需要,我希望能够更改格式。如果我使用MatchEvaluators,则每次都必须重新编译。这就是为什么我不想使用MatchEvaluator。
我遇到的问题是我不知道如何或者是否可能告诉Replace如果找到了一个组,请包含此字符串。我见过的唯一的语法就像(?<group>:data)
,但我不能让它工作。好吧,如果有人有想法,我会全力以赴。
编辑:
当前Capture Regexes =
^(\[(?<FanSub>[^\]\)\}]+)\])?[. _]*(?<SeriesTitle>[\w. ]*?)[. _]*\-[. _]*(?<EpisodeNumber>\d+)[. _]*(\-[. _]*(?<EpisodeName>[\w. ]*?)[. _]*)?([\[\(\{](?<MiscInfo>[^\]\)\}]*)[\]\)\}][. _]*)*[\w. ]*(?<Extension>\.[a-zA-Z]+)$
^(?<SeriesTitle>[\w. ]*?)[. _]*[Ss](?<SeasonNumber>\d+)[Ee](?<EpisodeNumber>\d+).*?(?<Extension>\.[a-zA-Z]+)$
^(?<SeriesTitle>[\w. ]*?)[. _]*(?<SeasonNumber>\d)(?<EpisodeNumber>\d{2}).*?(?<Extension>\.[a-zA-Z]+)$
当前替换正则表达式= [${FanSub}]${SeriesTitle} - ${EpisodeNumber} [${MiscInfo}]${Extension}
使用Regex.Replace,文件TestFile 101.mkv
,我得到[]TestFile - 1[].mkv
。我想要做的是,只有在找到小组[]
或FanSub
时才会包含MiscInfo
。
我可以使用MatchEvaluator来解决这个问题,因为我实际上已经编译了一个函数。但对于该计划的用户来说,这不是一个简单的解决方案。我必须解决的另一个想法是实际制作我自己的Regex.Replace函数,它接受特殊的语法。
答案 0 :(得分:0)
听起来您希望能够动态指定任意格式,而不是将其硬编码到代码中。
也许一种解决方案是将您的文件名部分分成特定的组,然后传递一个利用这些组名的替换模式。这将使您能够传递不同的替换模式,使用Regex.Replace method返回所需的文件名结构。
由于您没有解释文件名的类别,我想出了一些随机组来演示。这是一个简单的例子:
string input = "Testing StupidName Number2 720p.mkv";
string pattern = @"^(?<Category>\w+)\s+(?<Name>.+?)\s+Number(?<Number>\d+)\s+(?<Resolution>\d+p)(?<Extension>\.mkv)$";
string[] replacePatterns =
{
"[${Category}]${Name} - ${Number}[${Resolution}]${Extension}",
"${Category} - ${Name} - ${Number} - ${Resolution}${Extension}",
"(${Number}) - [${Resolution}] ${Name} [${Category}]${Extension}"
};
foreach (string replacePattern in replacePatterns)
{
Console.WriteLine(Regex.Replace(input, pattern, replacePattern));
}
如示例所示,模式中指定为(?<Name>pattern)
的命名组在替换模式中由${Name}
引用。
使用这种方法,您需要事先知道组名称并将其传递给需要重新排列模式。