【问题标题】:Comparing two different folders with Regex in C#在 C# 中使用 Regex 比较两个不同的文件夹
【发布时间】:2021-04-15 09:26:04
【问题描述】:

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

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


    【解决方案1】:

    这是一种使用正则表达式编写自定义比较器的方法:

    public static Regex rx = new Regex(@"^(TC_)_?(\d+).*", RegexOptions.Compiled);
    public class FilePathComparer : IEqualityComparer<string>
    {
        public bool Equals(string x, string y)
        {
            return rx.Replace(x, "$1$2") == rx.Replace(y, "$1$2");
        }
        public int GetHashCode(string s)
        {
            return rx.Replace(s,"$1$2").GetHashCode();
        }
    }
    

    在后面的代码中,就用

    var intersected = FileNames_List_Jetzt_Dateien.Intersect(TEST_FÄLLE, new FilePathComparer());
    

    请参阅C# demoregex demo

    ^(TC_)_?(\d+).* 正则表达式匹配

    • ^ - 字符串开头
    • (TC_) - 第 1 组 ($1):TC_
    • _? - 可选的下划线
    • (\d+) - 第 2 组 ($2):一位或多位数字
    • .* - 字符串的其余部分。

    【讨论】:

      【解决方案2】:

      您可以编写自定义比较器并将其传递给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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多