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

C# 正则表达式以匹配rar归档文件集中的第一个文件,c#,regex,C#,Regex,我该怎么做?我看到了一个解决方案,它没有为ruby使用一个正则表达式,因为ruby不支持loookaround断言。但是在c#中可能吗 这应该通过您的测试: var regex = new Regex(@"(\.001|\.part0*1\.rar|^((?!part\d*\.rar$).)*\.rar)$", RegexOptions.IgnoreCase | RegexOptions.Singleline); Assert.That(regex.IsMatch("filena

我该怎么做?我看到了一个解决方案,它没有为ruby使用一个正则表达式,因为ruby不支持loookaround断言。但是在c#中可能吗


这应该通过您的测试:

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

您可以在一个正则表达式中完成这项工作,无论是在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";
}
//
///如果文件扩展名为.001,则返回true。
///如果扩展名为.rar,请检查是否有零件号
///就在延期之前。
///如果没有零件号,则返回true。
///如果有零件号,如果零件号为1,则返回true。
///在所有其他情况下,返回false。
/// 
静态bool isMainFile(字符串名称)
{
字符串扩展名=Path.GetExtension(名称);
如果(扩展名=“.001”)
返回true;
if(扩展名!=“.rar”)
返回false;
Match Match=Regex.Match(名称@“\.part(\d+)\.rar$”;
如果(!match.Success)
返回true;
字符串partNumber=match.Groups[1]。Value.TrimStart('0');
返回零件号==“1”;
}
我在这里留下了一个正则表达式,因为它不太复杂,而对我来说,摆弄路径函数的替代方法似乎很笨拙。总的来说,我认为上面的代码比正则表达式更清楚地表达了意图


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

这正是我想要的,谢谢!我尝试了几乎相同的东西在不同的组合,但我不能让它工作,但这是完美的工作!我需要提高一下我的正则表达式技能!我发现了这个问题,因此我不确定它是否可以做到:我想这是一个在代码中描述您想要的东西还是使用测试描述正则表达式之间的品味问题。我主要在linq查询中使用该函数,类似于:var file=from f in Directory.GetFiles(path),其中RarFirstFileRegex.IsMatch(f);
/// <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";
}