XMLからNCCに1発でフォーマット変換するための.NET正規表現

NCC形式(.ncc)

  • e-Taxソフト」で使用されるデータファイルの形式
  • 内部構造は基本的XML と同様だが、一部のタグの要素に含まれる文字だけを文字実体参照に変換する必要がある
  • 文字コードUTF-8
  • 改行コードは LF

.NET正規表現

  • 一部のタグに含まれる文字を文字実体参照に変換する必要がある

上述のこの変換を行わないとe-Tax上で帳票データ等を開いたときにエラーで強制終了してしまうので、XMLをパースして置換するなどしなければならないが形式変換のためだけにパーサを書くのも面倒なので正規表現で一発置換を試みました。

変換部分をキャプチャするための.NET正規表現パターン(を含むC#のコード)

new Regex(@"((?<TAG><param name=""(帳票データ\w*|アイテム本体|添付書類本体)"">)(.*?)(?<-TAG></param>))?(?(TAG)(?!))", RegexOptions.Singleline);

置換するコードを簡潔に書けて便利なのですが処理速度がかなり遅いです。試しに処理速度を計測したところ1.35MBのNCCファイルの変換で600ms程度、3.97MBで4000ms程度かかりました。使い捨てスクリプトで使う分には辛うじて許容出来ますが、業務用のコードで使うには処理速度と保守性の観点から厳しそうです。

参考

.NETの正規表現では再帰的なパターンマッチを記述することが出来ませんが、グループ定義の均等化という機能の構文を使って同様のことが可能です。
http://msdn.microsoft.com/ja-jp/library/bs2twtah(v=vs.110).aspx#balancing_group_definition