首页 > 解决方案 > 在 C# 中使用 Regex 比较两个不同的文件夹

问题描述

我想比较一个文件是否在两个不同的文件夹中。

var reg = new Regex(@"TC__\d{3,4}_8exp$");
var reg1 = new Regex(@"TC_\d{3,4}$");
  
var FileNames_List_Jetzt_Dateien = Directory.GetFiles(@"PATH2", "*.html")
           .Where(path => reg.IsMatch(Path.GetFileNameWithoutExtension(path)))
           .Select(Folder_Jetzt_Dateien =>
               Path.GetFileNameWithoutExtension(Folder_Jetzt_Dateien));

从这个我得到列表:

TC__6493_8exp
TC__6494_8exp
TC__6495_8exp...

从这个:

var TEST_FÄLLE = Directory.GetFiles(@"PATH2", "*.exp")
          .Where(path => reg1.IsMatch(Path.GetFileNameWithoutExtension(path)))
          .Select(Folder_Jetzt_Dateien =>
              Path.GetFileNameWithoutExtension(Folder_Jetzt_Dateien));

我正在获取列表:

TC_6493
TC_6494
TC_6495...

对我来说TC__6493_8expTC_6493相同。如何对这两个具有相同元素的列表使用相交?

标签: c#regex

解决方案


您可以编写自定义比较器并将其传递给Intersect方法

using System.Collections.Generic;

class FileComparer : IEqualityComparer<string>
{
    const string ext = "_exp8";
    
    public bool Equals(string left, string right)
    {
        if (left.EndsWith(ext) && !right.EndsWith(ext))
        {
            return StripExt(left) == right;
        }
        else if (right.EndsWith(ext))
        {
            return left == StripExt(right);
        }
            
        return left == right;
    }
    
    private static string StripExt(string s)
        => s.Substring(0, s.Length - ext.Length);
    
    public int GetHashCode(string s)
    {
        if (s.EndsWith(ext))
        {
            return StripExt(s).GetHashCode();
        }
        else
        {
            return s.GetHashCode();
        }
    }
}
using System;
using System.Linq;

var files1 = new string[] { "1", "2", "3" };
var files2 = new string[] { "1_ext", "2_exp8", "3_exp8" };

var a = files1.Intersect(files2, new FileComparer());

var res = string.Join(", ", a);
Console.WriteLine(res);

推荐阅读