進コードの文字列表現と非印字可能なASCIIを置き換えます16進コード番号の表現であるので、私は次のようになります:は、.NET、私はそれでいくつかの非印字可能なASCII文字の文字列、のようなものを持っている
"ABCD[09][05][0D][0A]"
どうすればよいでしょうか?正規表現を使用できますか?
進コードの文字列表現と非印字可能なASCIIを置き換えます16進コード番号の表現であるので、私は次のようになります:は、.NET、私はそれでいくつかの非印字可能なASCII文字の文字列、のようなものを持っている
"ABCD[09][05][0D][0A]"
どうすればよいでしょうか?正規表現を使用できますか?
任意の制御文字にマッチし\p{Cc}
パターン、そう
Regex.Replace(input,
@"\p{Cc}",
a=>string.Format("[{0:X2}]", (byte)a.Value[0])
);
も制御文字を置き換えます。
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
の呼び出しに投影を集中させますこれははっきりしており、パフォーマンスが重要でない限り、それほど重要ではないでしょう。
Aghh。数分で私を打つ。 LINQPadを介して作業を確認しました。 –
ああ、ありがとう、私は不明確なバージョンを見なければならないのは嫌だ。 –
+1;素晴らしいサンプルコード。今では '集計 'の用途を見つけるための足がかりを持っています。私は個人的にselect関数をローカルの代理人にプッシュして読みやすくしています。 –
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()));
私は機能のためにこれをテストしました。
nice。簡単で簡単に従うことができます。 – user380689
"ABCD [09] \ x09 \ x05 \ r \ n"は "ABCD [09] [09] [05] [0D] [0A]"という結果になるので、これを元のメッセージに簡単に戻すことはできません。 "オープニングブレース(通常は "[["を使用して、私の例が "ABCD [[09] [09] [05] [0D] [0A]"になるようにします –