C#:在文件路径中查找对象名称以进行分组?

时间:2017-07-12 14:43:13

标签: c# algorithm

我有多个文件路径,它们并不完全相同,但都包含一个带有对象名称的文件夹,然后再进入某个路径。这一点并不总是一致的,名称也不一致。但是,对于相同的对象,对象名称将在多个路径中保持一致。例如:

  1. C:\ ABC \ I33 \ p4l \ object1 \ SO1 \ mko0 \等等\ FILENAME.EXT
  2. C:\ ABC \ I33 \ p4l \ object1 \ SO1 \ jiop1 \梅\ FILENAME.EXT
  3. C:\ ABC \ I33 \ p4l \ object1 \ SO1 \ JUM \ I99 \ FILENAME.EXT
  4. 在上面的例子中,我要找的名字是'object1'。但是,在下一个例子中,我正在寻找'pkwm34'。

    1. C:\ ertgh \ xcvh \ bfrth32456 \ pkwm34 \ werg \ ASDC \ DDF \ FILENAME.EXT
    2. C:\ ertgh \ xcvh \ bfrth32456 \ abc_pkwm34_jj5 \ werg \ ASDC \ DDF \ FILENAME.EXT
    3. C:\ ertgh \ xcvh \ bfrth32456 \ abc_pkwm34_abc_abc_jj5 \ werg \ ASDC \ DDF \ FILENAME.EXT
    4. C:\ ertgh \ xcvh \ bfrth32456 \ abc_pkwm34_abc_abc_jj5 \ werg \ ASDC \ ddf4 \ FILENAME.EXT
    5. C:\ ertgh \ xcvh \ bfrth32456 \ abc_pkwm34_abc_abc_jj5 \ werg \ ASDC \ ddf4 \ FILENAME.EXT
    6. C:\ ertgh \ xcvh \ bfrth32456 \ abc_pkwm34_abc_abc_jj5 \ ji2345op1 \ sdfg \ FILENAME.EXT
    7. C:\ ertgh \ xcvh \ bfrth32456 \ abc_pkwm34_abc_abc_jj5 \ juxcm \ isdf99 \ FILENAME.EXT
    8. 我完全不确定如何处理这个问题,因为KMP算法仍然需要完整的字符串,加上要搜索的模式。所以基本上我正在分析它的方式,我必须找到所有可以使用string.Split打破的精确模式匹配,但是在现实世界的场景中我最终会在'\'和'上拆分_'然后以50%以上的模式进行搜索。这是一项艰巨的任务,此时我会非常喜欢这方面的帮助。可能出现的另一个问题,或者有人可能会问的问题是,这些模式都不会出现在可识别的语言中。此外,由于工作限制,在这种情况下我无法访问外部工具。

      修改

      为了帮助所有来回答这个问题,我将在评论中发布有用的问题的答案,以便您可以在本文的底部快速找到它们。

      • 文件夹名称分隔符并不总是下划线,也可以是空格。
      • 文件夹名称不在一致的层次结构级别,可以是从第二级到最后一级的任何位置。
      • 无需最快的实施,可以使用强力算法。

      谢谢, 杰米

1 个答案:

答案 0 :(得分:0)

以下是使用RegEx模式搜索的示例实现:

        var list = new List<string>
        {
            @"C:\abc\i33\p4l\object1\so1\mko0\blah\filename.ext ",
            @"C:\abc\i33\p4l\object1\so1\jiop1\mei\filename.ext ",
            @"C:\abc\i33\p4l\object1\so1\jum\i99\filename.ext ",
            @"C:\ertgh\xcvh\bfrth32456\pkwm34\werg\asdc\ddf\filename.ext ",
            @"C:\ertgh\xcvh\bfrth32456\abc_pkwm34_jj5\werg\asdc\ddf\filename.ext ",
            @"C:\ertgh\xcvh\bfrth32456\abc_pkwm34_abc_abc_jj5\werg\asdc\ddf\filename.ext ",
            @"C:\ertgh\xcvh\bfrth32456\abc_pkwm34_abc_abc_jj5\werg\asdc\ddf4\filename.ext ",
            @"C:\ertgh\xcvh\bfrth32456\abc_pkwm34_abc_abc_jj5\werg\asdc\ddf4\filename.ext ",
            @"C:\ertgh\xcvh\bfrth32456\abc_pkwm34_abc_abc_jj5\ji2345op1\sdfg\filename.ext ",
            @"C:\ertgh\xcvh\bfrth32456\abc_pkwm34_abc_abc_jj5\juxcm\isdf99\filename.ext "
        };
        var textToFind = @"\W*(object1)|(pkwm34)\W*";
        var results = list.Where(x =>
            x.Split('\\').Any(y => Regex.IsMatch(y, textToFind, RegexOptions.IgnoreCase))
        ).ToList();