When displaying dynamic content that might contain square brackets, escape it to prevent markup parsing errors.
Escape User Input
To safely display user-provided strings, use Markup.Escape().
// User input that contains brackets
var userInput = "Use [brackets] for indexing";
var escaped = Markup.Escape(userInput);
// Safe to use in markup string
AnsiConsole.MarkupLine($"[blue]Input:[/] {escaped}");
// Common patterns that need escaping
var configKey = "settings[debug]";
var arrayRef = "items[0]";
AnsiConsole.MarkupLine($"[green]Config:[/] {Markup.Escape(configKey)}");
AnsiConsole.MarkupLine($"[green]Array:[/] {Markup.Escape(arrayRef)}");
Use Safe Interpolation
For cleaner code with multiple dynamic values, use MarkupLineInterpolated() which escapes automatically.
// Values that contain brackets are escaped automatically
var fileName = "config[backup].json";
var userName = "admin[test]";
var version = "v2.0[beta]";
// No manual escaping needed
AnsiConsole.MarkupLineInterpolated($"[blue]File:[/] {fileName}");
AnsiConsole.MarkupLineInterpolated($"[green]User:[/] {userName}");
AnsiConsole.MarkupLineInterpolated($"[yellow]Version:[/] {version}");
// Works with multiple interpolated values
AnsiConsole.MarkupLineInterpolated(
$"[dim]Loaded[/] {fileName} [dim]for user[/] {userName}");
Strip Markup for Plain Text
To get plain text without markup tags (for logging or file output), use Markup.Remove().
var styled = "[bold red]Error:[/] Connection to [blue]database[/] failed";
// Remove all markup tags for plain text
var plain = Markup.Remove(styled);
AnsiConsole.MarkupLine("[dim]Styled output:[/]");
AnsiConsole.MarkupLine(styled);
AnsiConsole.MarkupLine("[dim]Plain text for logs:[/]");
AnsiConsole.WriteLine(plain);
See Also
- Markup Reference - Complete markup syntax including escaping rules
- Markup Widget - Markup API reference