テキスト ファイルを文字列に読み込んで、すべての Unicode エスケープを文字列内の実際の Unicode 文字に変換したいとします。
例:
「次は Unicode の整数文字 '\u2320' の上半分で、これは下半分の '\U2321' です。」
答えは簡単で、少なくとも数千文字までの文字列でうまく機能します。
例 1:
Regex rx = new Regex( @"\\[uU]([0-9A-F]{4})" );
result = rx.Replace( result, match => ((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString() );
例 2:
Regex rx = new Regex( @"\\[uU]([0-9A-F]{4})" );
result = rx.Replace( result, delegate (Match match) { return ((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString(); } );
最初の例は、ラムダ式 (C# 3.0) を使用して行われる置換を示し、2 番目の例は、C# 2.0 で動作するはずのデリゲートを使用しています。
ここで何が起こっているかを分析するために、まず正規表現を作成します。
new Regex( @"\\[uU]([0-9A-F]{4})" );
次に、文字列 'result' と、文字列で見つかった各正規表現を変換する匿名メソッド (最初の例ではラムダ式、2 番目の例ではデリゲート - デリゲートは通常のメソッドでもかまいません) を指定して Replace() を呼び出します。 .
Unicode エスケープは次のように処理されます。
((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString(); });
エスケープの数字部分を表す文字列を取得します (最初の 2 文字をスキップします)。
match.Value.Substring(2)
Int32.Parse() を使用してその文字列を解析します。これは、Parse() 関数が期待する文字列と数値形式 (この場合は 16 進数) を取ります。
NumberStyles.HexNumber
次に、結果の数値を Unicode 文字にキャストします。
(char)
最後に、Unicode 文字で ToString() を呼び出します。これにより、Replace() に返される値である文字列表現が得られます。
.ToString()
注: Substring 呼び出しで変換するテキストを取得する代わりに、match パラメーターの GroupCollection を使用し、正規表現の部分式を使用して数値 ('2320') だけを取得することもできますが、これはより複雑で読みにくくなります。
これは VB.NET に相当します。
Dim rx As New RegularExpressions.Regex("\\[uU]([0-9A-Fa-f]{4})")
result = rx.Replace(result, Function(match) CChar(ChrW(Int32.Parse(match.Value.Substring(2), Globalization.NumberStyles.HexNumber))).ToString())
正規表現に小文字を追加したほうがよいと思います。それは私にとってはうまくいきました。
Regex rx = new Regex(@"\\[uU]([0-9A-Fa-f]{4})");
result = rx.Replace(result, match => ((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString());
プロジェクトにクラスを追加UnicodeExtensions.csします。
public static class UnicodeExtensions
{
private static readonly Regex Regex = new Regex(@"\\[uU]([0-9A-Fa-f]{4})");
public static string UnescapeUnicode(this string str)
{
return Regex.Replace(str,
match => ((char) int.Parse(match.Value.Substring(2),
NumberStyles.HexNumber)).ToString());
}
}
利用方法:
var test = "\\u0074\\u0068\\u0069\\u0073 \\u0069\\u0073 \\u0074\\u0065\\u0073\\u0074\\u002e";
var output = test.UnescapeUnicode(); // output is => this is test.