代码之家  ›  专栏  ›  技术社区  ›  David Stocking

不带匹配计算器的C中的条件regex替换

  •  1
  • David Stocking  · 技术社区  · 16 年前

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

    [测试]stubidname-2[720p].mkv

    但是,如果需要的话,我希望能够更改格式。如果我使用MatchEvaluator,那么每次都必须重新编译。所以我不想使用MatchEvaluator。

    我遇到的问题是,我不知道如何或如果可能,告诉replace如果找到组,请包含此字符串。我所见过的唯一的语法是 (?<group>:data) 但是我不能让它工作。如果有人有主意,我完全赞成。

    编辑:

    当前捕获正则表达式=

    ^(\[(?<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]+)$
    

    当前替换regex= [${FanSub}]${SeriesTitle} - ${EpisodeNumber} [${MiscInfo}]${Extension}

    使用regex.replace,文件 TestFile 101.mkv 我得到 []TestFile - 1[].mkv . 我要做的是让它 [] 仅当组 FanSub MiscInfo 被发现。

    我可以用MatchEvaluator来解决这个问题,因为我实际上可以编译一个函数。但对于程序的用户来说,这不是一个简单的解决方案。我要解决的另一个想法是实际制作自己的regex.replace函数,它接受特殊的语法。

    1 回复  |  直到 16 年前
        1
  •  0
  •   Ahmad Mageed    16 年前

    听起来您希望能够动态地指定任意格式,而不是将其硬编码到代码中。

    也许一个解决方案是将文件名部分分解成特定的组,然后传递一个利用这些组名的替换模式。这将使您能够传递不同的替换模式,这些替换模式使用 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} .

    使用这种方法,您需要事先知道组名,并根据需要传递这些组名来重新排列模式。