Replace, Trim și Substring în C# (.NET)

Șiruri de caractere (String) .NET 1.0+ (Range operator .. în C# 8.0+)

Curăță spațiile de la capete, înlocuiește fragmente de text și extrage sub-șiruri prin Substring sau operatorul de interval (..).

Sintaxă C#
string curat = text.Trim().Replace("vechi", "nou"); | string sub = text[start..end];

Ce face Replace, Trim și Substring

În .NET, tipul string este imutabil: nicio metodă precum Replace, Trim, Substring, ToUpperInvariant sau PadLeft nu modifică șirul original în memorie, ci construiește și returnează un șir nou cu transformarea aplicată. Dacă nu atribui rezultatul unei variabile, modificarea se pierde.

Pentru extragerea unei porțiuni dintr-un șir, pe lângă metoda clasică Substring(indexStart, lungime), C# 8+ oferă sintaxa modernă de indexare și intervale (Indices and Ranges): text[0..4] extrage caracterele de la indexul 0 până la 4 (exclusiv), text[3..] extrage totul de la indexul 3 până la capăt, iar prefixul ^ numără de la sfârșitul șirului (de exemplu, text[..^4] elimină ultimele 4 caractere).

Parametri, metode și opțiuni

Parametru / Metodă Descriere
text.Trim() / TrimStart() / TrimEnd() Elimină spațiile albe (sau caracterele specificate în paranteză) de la ambele capete, doar de la început sau doar de la sfârșit.
text.Replace(string oldVal, string newVal) Înlocuiește toate aparițiile sub-șirului oldVal cu newVal (acceptă și StringComparison în .NET Core 2.1+).
text.Substring(int startIndex, int length) Extrage un sub-șir care începe la poziția startIndex și are length caractere.
text[start..end] / text[^n..] Operatorul de interval (C# 8+): extrage sub-șirul între limitele start (inclusiv) și end (exclusiv); ^n numără de la final.
text.ToLowerInvariant() / ToUpperInvariant() Convertește șirul la litere mici sau mari folosind regulile culturii invariante.
text.PadLeft(int totalWidth, char paddingChar) Completează șirul la stânga cu caracterul specificat până ajunge la lungimea totală totalWidth.

Exemple

Exemplul 1: Normalizarea unui slug URL cu Trim, ToLowerInvariant și Replace

Înlănțuim metodele pe string pentru a curăța un titlu de articol și a-i adăuga un număr de ordine formatat cu PadLeft.

string titluBrut = "   /// Ghid C# și .NET 8 ///   ";

string curatat = titluBrut
    .Trim()
    .Trim('/')
    .Trim()
    .ToLowerInvariant()
    .Replace("c#", "csharp")
    .Replace(".net ", "dotnet-")
    .Replace(" ", "-");

string codArticol = "42".PadLeft(5, '0');
Console.WriteLine($" Articol #{codArticol}: {curatat}");

Ieșire în consolă

 Articol #00042: ghid-csharp-și-dotnet-8

Exemplul 2: Extragerea fragmentelor cu Substring și cu operatorul Range (.. și ^)

Operatorul de interval [start..end] este tradus de compilator în apeluri Substring, dar este mult mai ușor de citit atunci când vrei să elimini un prefix sau un sufix.

string numeFisier = "IMG_20261023_vacanta.jpg";

string prefix = numeFisier[..3];          // primele 3 caractere ("IMG")
string data = numeFisier.Substring(4, 8); // 8 caractere începând de la indexul 4
string faraExtensie = numeFisier[..^4];   // tot șirul fără ultimele 4 caractere (".jpg")
string extensie = numeFisier[^3..];       // ultimele 3 caractere ("jpg")

Console.WriteLine($"Prefix: {prefix} | Data: {data} | Bază: {faraExtensie} | Ext: {extensie}");

Ieșire în consolă

Prefix: IMG | Data: 20261023 | Bază: IMG_20261023_vacanta | Ext: jpg

Greșeli frecvente

  • Apelarea text.Replace("a", "b"); ca instrucțiune de sine stătătoare, fără text = text.Replace("a", "b"); — deoarece string este imutabil în C#, variabila text rămâne neschimbată dacă nu reatribui valoarea returnată.
  • Confuzia între al doilea parametru din Substring(start, length) (care reprezintă lungimea fragmentului) și al doilea număr din text[start..end] (care reprezintă indexul de final exclusiv).
  • Depășirea lungimii șirului în Substring sau în operatorul [..], ceea ce aruncă imediat ArgumentOutOfRangeException; verifică întotdeauna text.Length înainte de tăiere.

Funcții și concepte înrudite

  • String.Split / String.Join: Desparte un șir de caractere într-un tablou de sub-șiruri după delimitatori și recompune o colecție într-un singur șir.
  • Contains, StartsWith și EndsWith: Verifică dacă un șir conține, începe sau se termină cu un anumit sub-șir și găsește poziția acestuia cu IndexOf.
  • StringBuilder: Construiește și modifică eficient șiruri de caractere într-un buffer mutabil, fără a aloca obiecte intermediare în bucle.
  • Array și Span<T>: Lucrează cu blocuri contigue de memorie și felii (slices) de înaltă performanță fără alocări suplimentare pe heap.