0

サンプル ソース コードを調べていて、この部分が理解できません。このコードは何をしているのですか? 主に正規表現の部分...

使用されるパラメーターで、「コード」は文字列であり、渡す C# ソース コードです。

  Match m = null;
  if ((m = Regex.Match(code, "(?ims)^[/']{2}REFDLL (?<ref>.+?)$")).Success)
  {
    foreach (string refDll in m.Groups["ref"].Value.Split(new char[] { ';', ',' }))
    {
      //2008-06-18 by Jeffrey, remove redundant \r
      string mdfyRefDll = refDll.Replace("\r", "").Replace("\n", "");
      //trim the ending .dll if exists
      if (mdfyRefDll.ToLower().EndsWith(".dll"))
          mdfyRefDll = mdfyRefDll.Substring(0, mdfyRefDll.Length - 4);
      string lcRefDll = mdfyRefDll.ToLower();
      if (lcRefDll == "system.data.linq" || lcRefDll == "system"
          || lcRefDll == "system.xml.linq" || lcRefDll == "system.core")
        continue;
      cp.ReferencedAssemblies.Add(mdfyRefDll + ".dll");
    }
  }
4

2 に答える 2

2

この画像は、投稿したコードで何が起こっているかを示していると思います。

RefDLL

Mini C# Lab のプロジェクトの説明は次のとおりです。

シンプルで短い C# コードを実行してテストするための便利なツールで、Visual Studio の起動を待つ時間を節約し、1 回限りのプロジェクト ファイルを大量に作成することを避けることができます。

そのプロジェクトにはドキュメントが欠落しているように見えるため、コードの作成者が参照された DLL を追加する特定の方法を選択した理由を推測するのは困難です。おそらく、彼はusing ステートメントとの競合を避けるためにそれを行ったのでしょう。

于 2012-06-04T18:39:42.553 に答える
1

まず、(?ims)オプションの指定です。 i大文字と小文字を区別せず、m複数行モードを指定し、s(IIRC) ドットオール オプションを有効にします。これは、ワイルドカード.に改行文字が含まれることを意味します。

次に、は「文字列はここで開始^する必要があり、前に文字はありません...」と主張し、最後に は「文字列はここで終了しなければならず、後続の文字はありません」と主張します。$

[/']{2}、スラッシュまたは単一引用符のいずれか 2 つ (つまり、、、、および ) に//一致し''ます。/''/

あなたREFDLL が見るものと正確に一致します。

(?<ref>.+?)、残りのすべての文字に一致します (最後の疑問符は不要です) s。オプションがあるため、これには改行文字が含まれることを覚えておいてください。この部分は、という名前の一致に保存されrefます。

要約すると、次のようなものに一致させようとしています

//REFDLL helloworld foobar

に「helloworld foobar」を格納しrefます。

于 2012-06-04T18:05:50.187 に答える