2017-07-12 5 views
0

私は複数のファイルパスを持っていますが、それらはすべて同じではありませんが、オブジェクトの名前のフォルダをすべて含んでいます。ポイントは必ずしも一貫しているわけではなく、どちらも名前ではありません。ただし、同じオブジェクトの場合、オブジェクト名は複数のパスにわたって一貫しています。たとえば、次のようにC#:ファイルパス内のオブジェクト名をグループ化して検索しますか?

  1. C:\ ABC \ I33 \ P4L \オブジェクト1 \ SO1 \ mko0 \何とか\
  2. ファイル名。拡張子C:\ ABC \ I33 \ P4L \オブジェクト1 \ SO1 \ jiop1 \ MEI \ファイル名.EXT
  3. C:\ ABC \ I33上記の例では、\ P4L \オブジェクト1 \ SO1 \ JUM \ I99 \ファイル名。拡張子

は、私が探しています名前は、 'オブジェクト1' です。しかし、この次の例では、私は 'pkwm34'を探しています。

  1. C:\ ertgh \ xcvh \ bfrth32456 \ pkwm34 \ werg \ ASDC \ DDF \ファイル名。拡張子
  2. C:\ ertgh \ xcvh \ bfrth32456 \ abc_pkwm34_jj5 \ werg \ ASDC \ DDF \ファイル名。拡張子
  3. C:\ ertgh \ xcvh \ bfrth32456 \ abc_pkwm34_abc_abc_jj5 \ werg \ ASDC \ DDF \ファイル名。拡張子
  4. C:\ ertgh \ xcvh \ bfrth32456 \ abc_pkwm34_abc_abc_jj5 \ werg \ ASDC \ ddf4 \ファイル名。拡張子
  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 \ファイル名。拡張子
  7. C:\ ertgh \ xcvh \ bfrth32456 \ abc_pkwm34_abc_abc_jj5 \ juxcm \ isdf99 \ファイル名。拡張子

私はまだKMPアルゴリズム以来、この問題にアプローチする方法の完全わかりませんよ完全な文字列と検索するパターンが必要です。だから本質的に私はそれを分析している方法、私はstring.Splitを使用して分割することができるすべての正確なパターンの一致を見つける必要がありますが、実際の世界のシナリオで私は '\'と ' _ 'を検索して50 +パターンを検索します。これは難しい作業でしたが、私はこの時点でいくつかの助けが必要です。起こり得る別の問題、または誰かが尋ねるかもしれないことは、パターンのどれもが認識可能な言語になることはないという事実であろう。また、この場合は仕事の制限のため外部ツールにアクセスすることはできません。

EDIT

あなたはこの記事の一番下にすぐにそれらを見つけることができるように、私が有用でコメントでの質問への回答を掲載します。この質問に答えるために来ることすべてを支援するために。

  • フォルダ名の区切り文字は必ずしもアンダースコアではなく、スペースでもかまいません。
  • フォルダ名の階層が一貫していないため、2番目のレベルから最後のレベルまでの任意の場所にすることができます。
  • 最も速い実装は不要ですが、ブルートフォースアルゴリズムを使用できます。

ここおかげで、 ジェイミー

+0

しかし、それはディレクトリhyrarchyの4レベルで常にですか?または、 'C:¥abc¥i33¥p4l¥FOO¥object1¥mko0¥blah¥filename.ext'でもかまいませんか? (fooは現在4レベルにあり、object1は5レベルにあります)。下線は常にfolder-nameの区切り文字ですか? –

+0

いいえ、はい、あなたが何を意味するかわかりません。私は過去数週間にわたって一貫性を追求してきましたが、オブジェクト名以外は何も探していませんでした。これは、階層の第9レベルの深さまで、第2、第3、すべての方法で行うことができます。区切り記号まではスペース、アンダースコア、ダッシュが表示されていますが、ダッシュは別の命名規則の一部として表示されます。 – 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

関連する問題