Ответ прост и хорошо работает со строками длиной не менее нескольких тысяч символов.
Пример 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})" );
Затем мы вызываем Replace () со строкой 'result' и анонимным методом (лямбда-выражение в первом примере и делегат во втором - делегат также может быть обычным методом), который преобразует каждое найденное регулярное выражение в строке.
Выход из Юникода обрабатывается так:
((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString(); });
Получить строку, представляющую числовую часть escape (пропустить первые два символа).
match.Value.Substring(2)
Разбор этой строки с использованием Int32.Parse (), который принимает строку и числовой формат, которого должна ожидать функция Parse (), которая в данном случае является шестнадцатеричным числом.
NumberStyles.HexNumber
Затем мы приводим полученное число к символу Unicode:
(char)
И, наконец, мы вызываем ToString () для символа Unicode, который дает нам его строковое представление, которое является значением, переданным обратно в Replace ():
.ToString()
Примечание. Вместо захвата текста для преобразования с помощью вызова подстроки вы можете использовать GroupCollection параметра соответствия и подвыражения в регулярном выражении, чтобы захватить только число ('2320'), но это более сложно и менее читабельно. .