2012-05-02 15 views
1

私はC#クラスを作成しようとしているXMLスキーマを持っています。現時点では、私はXSD2Codeと一緒にクラスを作成しています。XMLコメントをC#属性で置き換える正規表現

/// <summary> 
/// ALT\N 
/// </summary> 
public string NumberOfTags { get; set; } 

XMLコメントはdifferent data representationにマップTMATSコードを参照:

<xs:element name="NumberOfTags" type="xs:positiveInteger" minOccurs="0"> 
    <xs:annotation> 
     <xs:documentation>ALT\N</xs:documentation> 
    </xs:annotation> 
</xs:element> 

XSD2Codeは、次のようになりますコードを生成します:original schemasはこのような何かを見ての要素を持っています。私はプログラムでこのマッピングを実行できるように、実行時に読みやすい表現でこれらのコードをキャプチャする必要があります。これまでのところこれを達成するための最良のアイデアは、これらのXMLコメントをC# Attributesに翻訳し、それを反映するための追加のコードを書くことです。


ここに私の質問があります。

[TmatsCode(@"ALT\N")] 
public string NumberOfTags { get; set; } 

これを達成する正規表現がどのようなものです:結果のコードは次のようになりますように私は、Visual Studioは検索と置換使用して、正規表現スタイルはXSD2Codeによって生成されたコードに置き換えるやりたいですか?

答えて

2

は、Visual Studioの&を交換してください検索使用

の検索と置換、あなたはトンを使用することができます彼の表現:

^.*\<summary\>\n{:b*}///:b*{.*}\n.*\<\/summary\>$ 

そして、この置換:

\1[TmatsCode(@"\2")] 

はそれを打破するには、次の

  • ^.*\<summary\>\n - マッチを行、文字の任意の量の初めに続いuptil改行。
  • {:b*}///すべての空白を///文字でキャプチャします。この捕捉された空白を後で使用して、属性を正​​しくインデントすることができます。
  • :b*{.*}が空白に一致する場合は、残りの部分を必要なコンテンツとしてキャプチャします。
  • \n.*\<\/summary\>$が新しい行で一致してから、終了要約要素の行の最後まで一致します。交換用

\1は、私たちが捕らえ空白はそう属性が同じ場所にインデントされており、\2は、要約コンテンツです。

+0

優秀、ありがとう!最近のうちに、私は正規表現を学ぶつもりです。それは私のtodoリストにあり、学ぶべき約千のものがあります。 :/ –

2
(?<=/// \<summary\>\r\n///)[^\r\n]+(?=\r\n/// \<\/summary\>) 

あなたの例では

ALT\N 

と一致します。

編集:

VSを見つけて交換しますか?それを気付かなかった...上記は、ネット正規表現です。

しかし、この方向で、あなたのコメントに答えて... Regex.ReplaceのMatchEvaluatorオーバーロードは、コメント全体に一致するようにRegexを少し書き直し、内部の値をキャプチャすることで独自のものになりますここではVisual Studioを使用

Regex.Replace(
str, 
@"/// \<summary\>\r\n/// (?<tag>[^\r\n]+)\r\n/// \<\/summary\>", 
m => string.Format(
     "[TmatsCode(@\"{0}\"]", 
     m.Groups["tag"].Value));