2017-07-12 55 views
0

我有多个文件路径,它们不完全相同,但是在某个点进一步深入路径之前,它们都包含一个带有对象名称的文件夹。关键并不总是一致的,名字也不一定。但是,对于相同的对象,对象名称将在多个路径中保持一致。例如:C#:查找分组文件路径中的对象名称?

  1. C:\ ABC \ I33 \ p4l \ object1 \ SO1 \ mko0 \等等\ FILENAME.EXT
  2. C:\ ABC \ I33 \ p4l \ object1 \ SO1 \ jiop1 \梅\文件名.EXT
  3. C:\ ABC \ I33 \ p4l \ object1 \ SO1 \ JUM \ -99 \ FILENAME.EXT

在上面的例子中,我寻找的名字是 '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_ab c_jj5 \ ji2345op1 \ sdfg \ FILENAME.EXT
  7. C:\ ertgh \ xcvh \ bfrth32456 \ abc_pkwm34_abc_abc_jj5 \ juxcm \ isdf99 \ FILENAME.EXT

我完全不知道应该如何处理这个问题,因为KMP算法仍需要完整的字符串,加上一个模式来搜索。所以基本上就是我分析它的方式,我不得不找到所有可以使用string.Split分解的确切模式匹配,但是在真实世界的场景中,我最终会在'\'和' _',然后以50多种模式结束搜索。这是一项艰巨的任务,现在我想在这方面提供一些帮助。另一个可能出现的问题,或者某人可能会问的事实是,没有一种模式会成为可识别的语言。另外,由于工作限制,我无法访问这种情况下的外部工具。

编辑

为了帮助所有来回答这个问题,我会在这是有益的意见张贴问题的答案,这样就可以在这个岗位的底部快速找到它们。

  • 文件夹名称分隔符并不总是下划线,它也可以是空格。
  • 文件夹名称不在层次结构的一致级别,它可以是从第二级到最后一级的任何地方。
  • 最快的实现并非必要,可以使用蛮力算法。

感谢, 杰米

+0

但它总是在目录hyrarchy的4级?或者它也可以是'C:\ abc \ i33 \ p4l \ FOO \ object1 \ mko0 \ blah \ filename.ext'? (foo现在在第4级,第1个在第5个)。下划线是否始终是文件夹名称的分隔符? –

+0

不,是的,不确定你的意思。在过去的几周里,我一直在寻找一致性,除了对象名以外没有任何其他的东西。它可以是第二,第三,一直到层级中的第九级。至于分隔符,我看到空格,下划线和破折号,尽管破折号看起来是另一个命名约定的一部分。 – lxxtacoxxl

+0

快速简单不是必需的,它可以在启动时在后台运行,而其他组件正在加载,这不是问题。 – lxxtacoxxl

回答

0

下面是使用正则表达式搜索的实现:

 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(); 
+0

这需要在搜索之前知道要搜索的文本。 – lxxtacoxxl