Как экранировать фигурные скобки { } в String.Format в C#?
Проблема с фигурными скобками в String.Format
В C# метод String.Format (и аналогично интерполяция строк $"...") использует фигурные скобки { } как специальные символы для указания мест подстановки значений (плейсхолдеров). Например, {0} означает "вставь первый аргумент". Если вы хотите вывести сами фигурные скобки как обычные символы, их нужно экранировать. В отличие от многих языков, где используется обратный слеш (\), в C# для экранирования фигурных скобок применяется их удвоение.
Решение: удвоение скобок
Чтобы вывести одну открывающую фигурную скобку {, напишите две подряд {{. Аналогично для закрывающей: }}. Компилятор интерпретирует {{ как один символ {, а }} как один символ }.
Исправленный пример для вашего кода:
string name = "John";
string result = String.Format("Привет, {0}! Значение: {{ x = 5 }}", name);
Console.WriteLine(result);
// Вывод: Привет, John! Значение: { x = 5 }
Обратите внимание: скобки вокруг x = 5 теперь удвоены — {{ и }}. Метод String.Format понимает это как команду вывести символы { и }.
Работа с интерполяцией строк ($"...")
То же самое правило работает и для интерполяции строк, которая является более современным способом форматирования в C# (начиная с C# 6):
string name = "John";
string result = $"Привет, {name}! Значение: {{ x = 5 }}";
Console.WriteLine(result);
// Вывод: Привет, John! Значение: { x = 5 }
В этом примере {name} — это подстановка переменной, а {{ x = 5 }} — экранированные скобки, которые выводятся как текст.
Сложные случаи: комбинация подстановки и экранирования
Если вам нужно вывести скобку вместе с подстановкой значения внутри неё, используйте комбинацию удвоенных и одинарных скобок. Например, чтобы получить строку { John }:
string name = "John";
string result = $"{{ {name} }}";
Console.WriteLine(result);
// Вывод: { John }
Здесь {{ даёт символ {, потом пробел, потом значение name, потом пробел, и }} даёт символ }.
Альтернативный способ: StringBuilder.AppendFormat
Если вы работаете со StringBuilder, метод AppendFormat использует те же правила экранирования:
var sb = new System.Text.StringBuilder();
sb.AppendFormat("Значение: {{ x = {0} }}", 5);
Console.WriteLine(sb.ToString());
// Вывод: Значение: { x = 5 }
Важные моменты
- Не используйте обратный слеш — в C# строковых escape-последовательностей для фигурных скобок нет.
\{вызовет ошибку компиляции. - Проверяйте количество скобок — если вы допустите ошибку (например, напишете
{вместо{{), компилятор может не заметить проблемы, но во время выполнения возникнетFormatException. - Для больших объёмов текста (например, шаблонов JSON или XML) рассмотрите использование
StringBuilderили сохранение шаблона в отдельном файле, чтобы избежать путаницы со скобками.
Использование StringBuilder и AppendLine для сложных шаблонов
Если вам нужно часто выводить фигурные скобки в составе больших текстов (например, генерировать JSON-строки или SQL-запросы), метод String.Format с удвоенными скобками может стать неудобным из-за снижения читаемости. В таких случаях лучше использовать StringBuilder с явным добавлением символов скобок через Append.
Пример генерации JSON:
var sb = new System.Text.StringBuilder();
sb.AppendLine("{");
sb.AppendLine(" \"name\": \"John\",");
sb.AppendLine(" \"age\": 30");
sb.AppendLine("}");
Console.WriteLine(sb.ToString());
// Вывод:
// {
// "name": "John",
// "age": 30
// }
Этот подход полностью избавляет от проблем с экранированием, так как вы управляете каждым символом напрямую. Для подстановки значений можно комбинировать Append и AppendFormat:
string name = "John";
int age = 30;
var sb = new System.Text.StringBuilder();
sb.AppendLine("{");
sb.AppendFormat(" \"name\": \"{0}\",\n", name);
sb.AppendFormat(" \"age\": {0}\n", age);
sb.AppendLine("}");
Console.WriteLine(sb.ToString());
Также для работы с JSON в C# рекомендуется использовать специализированные библиотеки, такие как Newtonsoft.Json (Json.NET) или System.Text.Json — они автоматически обрабатывают экранирование и форматирование.
Для простых случаев (например, вывод одной строки с парой скобок) вполне достаточно удвоения скобок в String.Format или интерполяции. Выбирайте способ в зависимости от сложности задачи.
Ответов пока нет.
Войдите чтобы оставить ответ