代码之家  ›  专栏  ›  技术社区  ›  MatteS

正则表达式以匹配rar归档文件集中的第一个文件

  •  3
  • MatteS  · 技术社区  · 16 年前

    [Test]
    public void RarArchiveFirstFileNameShouldMatch() {
        var regex = new Regex(@"\.(rar|001)$", RegexOptions.IgnoreCase | RegexOptions.Singleline);
        Assert.That(regex.IsMatch("filename.001"));
        Assert.That(regex.IsMatch("filename.rar"));
        Assert.That(regex.IsMatch("filename.part1.rar"));
        Assert.That(regex.IsMatch("filename.part01.rar"));
        Assert.That(regex.IsMatch("filenamepart44.rar"));
        Assert.That(regex.IsMatch("filename.004"), Is.False);
        Assert.That(regex.IsMatch("filename.057"), Is.False);
        Assert.That(regex.IsMatch("filename.r67"), Is.False);
        Assert.That(regex.IsMatch("filename.s89"), Is.False);
        Assert.That(regex.IsMatch("filename.part2.rar"), Is.False);
        Assert.That(regex.IsMatch("filename.part04.rar"), Is.False);
        Assert.That(regex.IsMatch("filename.part11.rar"), Is.False);
    }
    
    2 回复  |  直到 16 年前
        1
  •  5
  •   Max Shawabkeh    16 年前

    这应该通过您的测试:

        var regex = new Regex(@"(\.001|\.part0*1\.rar|^((?!part\d*\.rar$).)*\.rar)$", RegexOptions.IgnoreCase | RegexOptions.Singleline);
        Assert.That(regex.IsMatch("filename.001"));
        Assert.That(regex.IsMatch("filename.rar"));
        Assert.That(regex.IsMatch("filename.part1.rar"));
        Assert.That(regex.IsMatch("filename.part01.rar"));
        Assert.That(regex.IsMatch("filename.004"), Is.False);
        Assert.That(regex.IsMatch("filename.057"), Is.False);
        Assert.That(regex.IsMatch("filename.r67"), Is.False);
        Assert.That(regex.IsMatch("filename.s89"), Is.False);
        Assert.That(regex.IsMatch("filename.part2.rar"), Is.False);
        Assert.That(regex.IsMatch("filename.part04.rar"), Is.False);
        Assert.That(regex.IsMatch("filename.part11.rar"), Is.False);
    
        2
  •  2
  •   Mark Byers    16 年前

    您可以在一个正则表达式中完成这项工作,无论是在C#还是在Ruby中,但为什么还要麻烦呢?

    /// <summary>
    /// Returns true if a filename's extension is .001.
    /// If the extensions is .rar, check to see if there is a part number
    /// immediately before the extension.
    /// If there is no part number, return true.
    /// If there is a part number, returns true if the part number is 1.
    /// In all other cases, return false.
    /// </summary>
    static bool isMainFile(string name)
    {
        string extension = Path.GetExtension(name);
        if (extension == ".001")
            return true;
        if (extension != ".rar")
            return false;
        Match match = Regex.Match(name, @"\.part(\d+)\.rar$");
        if (!match.Success)
            return true;
        string partNumber = match.Groups[1].Value.TrimStart('0');
        return partNumber == "1";
    }
    

    我在这里留下了一个正则表达式,因为它不太复杂,而对我来说,摆弄路径函数的替代方法似乎很笨拙。总的来说,我认为上面的代码比正则表达式更清楚地表达了意图。

    我确实喜欢用一个优雅的正则表达式干净地解决一个问题,但我不确定一个正则表达式是否是解决这个问题的最佳方法。