【问题标题】:Regex to match the first file in a rar archive file set正则表达式匹配 rar 存档文件集中的第一个文件
【发布时间】:2010-02-06 13:36:32
【问题描述】:

我该怎么做?我已经看到一个解决方案不使用单个正则表达式来处理 ruby​​,因为 ruby​​ 不支持环视断言。但是在c#中可以吗?

[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);
}

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    这应该可以通过你的测试:

        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】:

    在 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";
    }
    

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

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

    【讨论】:

    • 我发现了这个问题,因此我不确定它是否可以完成:stackoverflow.com/questions/109916/… 我想在代码中描述你想要的内容或使用测试描述正则表达式之间是一个品味问题。我主要在 linq 查询中使用该函数,有点像:var file = from f in Directory.GetFiles(path) where RarFirstFileRegex.IsMatch(f);
    猜你喜欢
    • 2010-09-11
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多