は2つの正規表現を使用します。一般的なフォームと一致する1番目、内部の配管を処理する2番目。
XMLエンコーディングの場合、私はSystem.Securityにあるわかりにくい小さなメソッドを使用しました:SecurityElement.Escape Method。私は強調するために以下のコードでそれを完全に修飾しました。もう1つのオプションはHttpUtility.HtmlEncode methodを使用していますが、これはどこでこれを使用しているかに応じてSystem.Webへの参照を含む場合があります。
string[] inputs = { @"[% 'test' <mtd:ddl id=""asdf"" runat=""server""/> & <%= Integer.MaxValue %> %]",
@"[% 'test' <mtd:ddl id=""asdf"" runat=""server""/> & <%=Integer.MaxValue %> %]",
@"[% 'test' <mtd:ddl id=""asdf"" runat=""server""/> & <%# Integer.MaxValue%> %]",
@"[% 'test' <mtd:ddl id=""asdf"" runat=""server""/> & <%#Integer.MaxValue%> %]",
};
string pattern = @"(?<open>\[%)(?<content>.*?)(?<close>%])";
string expressionPattern = @"(?<content>.*?)(?<tag><%(?:[=#]))\s*(?<expression>.*?)\s*%>";
foreach (string input in inputs)
{
string result = Regex.Replace(input, pattern, m =>
m.Groups["open"].Value +
Regex.Replace(m.Groups["content"].Value, expressionPattern,
expressionMatch =>
System.Security.SecurityElement.Escape(expressionMatch.Groups["content"].Value) +
expressionMatch.Groups["tag"].Value + " " +
expressionMatch.Groups["expression"].Value +
" %>"
) +
m.Groups["close"].Value
);
Console.WriteLine("Before: {0}", input);
Console.WriteLine("After: {0}", result);
}
結果:
Before: [% 'test' <mtd:ddl id="asdf" runat="server"/> & <%= Integer.MaxValue %> %]
After: [% 'test' <mtd:ddl id="asdf" runat="server"/> & <%= Integer.MaxValue %> %]
Before: [% 'test' <mtd:ddl id="asdf" runat="server"/> & <%=Integer.MaxValue %> %]
After: [% 'test' <mtd:ddl id="asdf" runat="server"/> & <%= Integer.MaxValue %> %]
Before: [% 'test' <mtd:ddl id="asdf" runat="server"/> & <%# Integer.MaxValue%> %]
After: [% 'test' <mtd:ddl id="asdf" runat="server"/> & <%# Integer.MaxValue %> %]
Before: [% 'test' <mtd:ddl id="asdf" runat="server"/> & <%#Integer.MaxValue%> %]
After: [% 'test' <mtd:ddl id="asdf" runat="server"/> & <%# Integer.MaxValue %> %]
EDIT:
:あなたが最終的な結果に[%%]クローズ/開口部を維持するために気にしない場合は、その後にパターンを変更します
string pattern = @"\[%(?<content>.*?)%]";
次に、m.Groups["open"].Value
と0の参照を削除してください。
あなたが記述ロジックは、正規表現よりも文字による文字列の文字を解析するためのより多くの仕事である」も参照してください。 – Cascabel
はJefromiに同意します。これは、1つの使用をするかもしれないいくつかのコードのジョブ(ありますまたは2つの正規表現) –