2011-08-12 7 views

答えて

23

任意の制御文字にマッチし\p{Cc}パターン、そう

Regex.Replace(input, 
       @"\p{Cc}", 
       a=>string.Format("[{0:X2}]", (byte)a.Value[0]) 
      ); 

も制御文字を置き換えます。

+0

nice。簡単で簡単に従うことができます。 – user380689

+0

"ABCD [09] \ x09 \ x05 \ r \ n"は "ABCD [09] [09] [05] [0D] [0A]"という結果になるので、これを元のメッセージに簡単に戻すことはできません。 "オープニングブレース(通常は "[["を使用して、私の例が "ABCD [[09] [09] [05] [0D] [0A]"になるようにします –

8
string s = "ABCD\x09\x05\r\n"; 
var replace = 
    s.Select(c => Char.IsControl(c) ? ((int)c).ToString("X2") : c.ToString()) 
    .Aggregate(new StringBuilder(), (sb, t) => sb.Append(t)) 
    .ToString(); 

申し訳ありませんが、コンパイラは便利ですが、私はこのことをコンパイルして行います。

また、この種の文字列を2回(各文字を16進数の置換または文字列に投影してから集計するために1回)、これを回避するにはEnumerable.Aggregateの呼び出しに投影を集中させますこれははっきりしており、パフォーマンスが重要でない限り、それほど重要ではないでしょう。

+0

Aghh。数分で私を打つ。 LINQPadを介して作業を確認しました。 –

+1

ああ、ありがとう、私は不明確なバージョンを見なければならないのは嫌だ。 –

+0

+1;素晴らしいサンプルコード。今では '集計 'の用途を見つけるための足がかりを持っています。私は個人的にselect関数をローカルの代理人にプッシュして読みやすくしています。 –

4

Jasonの例に触発されていますが、少しシンプルです。私はより良い実行するか分からない、と今それベンチマークまでの時間を持っていないが、それはただ1回のパスですべてを行う必要があります。

string s = "ABCD\x09\x05\r\n"; 
string replace = String.Concat(s.Select(c => Char.IsControl(c) ? 
              String.Format("[{0:X2}]", (int)c) : 
              c.ToString())); 

私は機能のためにこれをテストしました。

関連する問題