2017-07-12 89 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