条件正则表达式替换C#没有MatchEvaluator

时间:2010-06-16 19:10:35

标签: c# regex

所以,我试图制作一个程序来重命名一些文件。在大多数情况下,我希望它们看起来像这样,

[测试] 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函数,它接受特殊的语法。

1 个答案:

答案 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}引用。

使用这种方法,您需要事先知道组名称并将其传递给需要重新排列模式。