Ответ прост и работает хорошо со строками по крайней мере до нескольких тысяч символов.
Пример 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) и второе использование делегат, который должен работать с C# 2.0.
Для разрушения, что продолжается здесь сначала мы создаем регулярное выражение:
new Regex( @"\\[uU]([0-9A-F]{4})" );
Тогда мы называем Замену () со строкой 'результатом' и анонимным методом (лямбда-выражение в первом примере и делегат во втором - делегат мог также быть обычным методом), который преобразовывает каждое регулярное выражение, которое найдено в строке.
Escape Unicode обрабатывается как это:
((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString(); });
Добираются, строка, представляющая часть числа Escape (пропустите первые два символа).
match.Value.Substring(2)
Синтаксический анализ та строка с помощью Int32. Синтаксический анализ (), который берет строку и числовой формат, который должен ожидать Синтаксический анализ () функция, который в этом случае является шестнадцатеричным числом.
NumberStyles.HexNumber
Тогда мы бросаем получающееся число к символу Unicode:
(char)
И наконец мы называем ToString () на символе Unicode, который дает нам его строковое представление, которое является значением, пасуемым назад для Замены ():
.ToString()
Примечание: Вместо того, чтобы захватить текст, который будет преобразован с вызовом Подстроки, Вы могли использовать параметр соответствия GroupCollection, и подвыражения в регулярном выражении для получения просто номера ('2320'), но это более сложно и менее читаемо.
Пересмотренный немного больше:
Regex regex = new Regex (@"\\U([0-9A-F]{4})", RegexOptions.IgnoreCase);
string line = "...";
line = regex.Replace (line, match => ((char)int.Parse (match.Groups[1].Value,
NumberStyles.HexNumber)).ToString ());