Menu

Metodi delle stringhe in C#: Split, Replace, Contains, IndexOf, Trim, Join e altri

I metodi di String che usi ogni giorno in C#: Split con più separatori e opzioni, Replace, Contains e la ricerca senza distinzione tra maiuscole e minuscole, IndexOf e LastIndexOf, StartsWith ed EndsWith, Trim, ToUpper e ToLower, PadLeft, Join, Concat e come invertire una stringa.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

System.String ha decine di metodi. Questa pagina copre quelli che fanno la maggior parte del lavoro nel codice reale, con le opzioni e le trappole che contano. Una regola vale per tutti: le stringhe sono immutabili, quindi ogni metodo restituisce una nuova stringa (o un valore) e lascia l'originale invariato. s.Trim(); da solo su una riga non fa nulla; scrivi s = s.Trim();.

Split

Split spezza una stringa in uno string[] in corrispondenza di ogni separatore:

Output:

3
apple
banana
cherry
red/green/ blue/yellow
INFO/started/ready

Nota " blue": Split taglia esattamente sul separatore e conserva gli spazi. Due opzioni gestiscono le pulizie più comuni:

Output:

5
4
c#|dotnet|linq
key=[Subject] value=[Re: Meeting: Friday]
3

RemoveEmptyEntries scarta le parti di lunghezza zero ma non quelle fatte solo di spazi (" " è sopravvissuto qui sopra). .NET 5 ha aggiunto StringSplitOptions.TrimEntries, e le due opzioni si possono combinare: tags.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) dà il risultato pulito con una sola chiamata. Passare null come separatore divide su qualsiasi spazio bianco, ed è il modo abituale per dividere un testo in parole.

Dividere su un singolo char (Split(',')) non richiede un array. Gli overload che accettano un char più le opzioni, o una singola string, esistono da .NET Core 2.0 in poi; le forme con array usate sopra funzionano ovunque, anche su .NET Framework e Unity.

Replace

Replace sostituisce tutte le occorrenze di un carattere o di una sottostringa:

Output:

5551234567
555.123.4567
Cats and dogs and CATS
dogs and dogs and dogs
dogs and cats and CATS
too many spaces

L'overload con un argomento StringComparison è disponibile su .NET Core 2.0 e successivi. Su .NET Framework la sostituzione senza distinzione tra maiuscole e minuscole si fa con Regex.Replace(text, Regex.Escape(find), replacement, RegexOptions.IgnoreCase). Sostituire con "" è il modo per rimuovere caratteri, e concatenare diverse chiamate a Replace va benissimo per poche sostituzioni.

Contains, IndexOf, StartsWith ed EndsWith

Questi metodi cercano. Contains risponde sì o no; IndexOf e LastIndexOf restituiscono una posizione, oppure -1 quando non c'è corrispondenza; StartsWith ed EndsWith controllano le estremità.

Output:

True
False
True
True
8
30
28
-1
16
False
True
True

Tutti distinguono maiuscole e minuscole per impostazione predefinita. Contains(string, StringComparison) esiste su .NET Core 2.1 e successivi; la forma IndexOf(...) >= 0 funziona in ogni versione, ed è per questo che la vedi nel codice più vecchio. IndexOfAny(new[] { ',', ';' }) trova il primo tra più caratteri.

Una nota sulla cultura: senza uno StringComparison, StartsWith, EndsWith, IndexOf(string) e CompareTo usano regole dipendenti dalla cultura, mentre Contains, Replace e IndexOf(char) confrontano in modo ordinale. Passare esplicitamente StringComparison.Ordinal o OrdinalIgnoreCase elimina l'ambiguità, ed è quello che raccomandano gli analizzatori di codice.

Trim, TrimStart e TrimEnd

Trim rimuove gli spazi bianchi (spazi, tabulazioni, a capo) da entrambe le estremità. TrimStart e TrimEnd rimuovono da una sola estremità. Se passi dei caratteri, rimuovono quelli:

Output:

[ana@example.com]
[ana@example.com \n]
[  x]
SALE
7
path/to/dir
1,234.50

Trim tocca solo le estremità; gli spazi all'interno della stringa restano. TrimStart('0') su "000" restituisce una stringa vuota, quindi analizza le stringhe numeriche con int.Parse invece di togliere gli zeri a mano.

ToUpper e ToLower

Output:

MAYA LOPEZ
maya lopez
MAYA LOPEZ
Coffee

ToUpper e ToLower seguono la cultura corrente, quindi in turco "i".ToUpper() è una İ maiuscola con il punto, non I. Per identificatori, chiavi e nomi di file usa ToUpperInvariant e ToLowerInvariant. Per confrontare, usa uno StringComparison invece di convertire le maiuscole (vedi stringhe). Per rendere maiuscola l'iniziale di ogni parola esiste CultureInfo.CurrentCulture.TextInfo.ToTitleCase(text), che però lascia stare le parole già tutte maiuscole.

PadLeft e PadRight

Il padding aggiunge caratteri finché la stringa non raggiunge una larghezza totale. È comodo per l'output a larghezza fissa e per aggiungere zeri iniziali ai codici:

Output:

000042
[Tea     ]
[     Tea]
Too long already
Espresso..  2.40
Latte.....  3.60
Mocha.....  3.95

L'allineamento nell'interpolazione ({name,-10}) fa lo stesso lavoro direttamente nella stringa.

Join e Concat

string.Join mette un separatore tra gli elementi di qualsiasi collezione. string.Concat unisce senza separatore:

Output:

Ana, Ben, Chloe
1 + 2 + 3
True
2026-09
AnaBenChloe
Ana, Ben and Chloe

Join è il modo giusto per costruire un elenco delimitato: non c'è un separatore finale da togliere, e costruisce il risultato in un solo passaggio. Chiama ToString() su ogni elemento, quindi funziona anche con numeri e oggetti.

Reverse, Insert e Remove

Non esiste un metodo string.Reverse che restituisca una stringa. I due approcci abituali:

Output:

desserts
desserts
True
2026/Q3-09
Hello
HelloWorld

word.Reverse() da solo restituisce un IEnumerable<char>, non una stringa; stamparlo mostra il nome di un tipo. Entrambi i metodi invertono le unità di codice UTF-16, il che rompe i caratteri formati da due unità (la maggior parte delle emoji) e le lettere con accenti combinati.

Riferimento rapido

OperazioneMetodo
Dividere in partis.Split(','), s.Split(new[] {',', ';'}, StringSplitOptions.RemoveEmptyEntries)
Sostituire tuttos.Replace("a", "b")
Contienes.Contains("x"), s.Contains("x", StringComparison.OrdinalIgnoreCase)
Posiziones.IndexOf("x"), s.LastIndexOf('x') (-1 se assente)
Inizia o finisce cons.StartsWith("x"), s.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase)
Togliere gli spazi alle estremitàs.Trim(), s.TrimStart(), s.TrimEnd()
Cambiare maiuscole e minuscoles.ToUpper(), s.ToLowerInvariant()
Riempire fino a una larghezzas.PadLeft(6, '0'), s.PadRight(10)
Unire una collezionestring.Join(", ", items)
Parte di una stringas.Substring(start, length)
Inserire o eliminares.Insert(i, "x"), s.Remove(i, count)
Controllo null o vuotastring.IsNullOrWhiteSpace(s)

Domande frequenti

Come divido una stringa in C#?

text.Split(',') restituisce uno string[] con le parti tra le virgole. Passa più separatori come array (Split(new[] { ',', ';' })), un separatore stringa con Split(new[] { ", " }, StringSplitOptions.None), e StringSplitOptions.RemoveEmptyEntries per scartare le parti vuote prodotte da separatori doppi. .NET 5 ha aggiunto StringSplitOptions.TrimEntries per rifilare ogni parte.

Come controllo se una stringa ne contiene un'altra, ignorando maiuscole e minuscole?

Su .NET Core 2.1 e successivi: text.Contains("error", StringComparison.OrdinalIgnoreCase). Su .NET Framework, che non ha quell'overload, usa text.IndexOf("error", StringComparison.OrdinalIgnoreCase) >= 0. Evita text.ToLower().Contains(...), che alloca una copia e con alcune culture può comportarsi in modo strano.

String.Replace modifica la stringa originale in C#?

No. Le stringhe sono immutabili, quindi Replace restituisce una nuova stringa con tutte le occorrenze sostituite e lascia l'originale com'era. Scrivi s = s.Replace("old", "new");. Sostituisce tutte le occorrenze, non solo la prima; per sostituire solo la prima, trovala con IndexOf e ricostruisci la stringa, oppure chiama Replace su un'istanza di Regex con un conteggio di 1.

Cosa restituisce IndexOf se la stringa non viene trovata?

-1. Qualsiasi risultato pari a 0 o maggiore è la posizione, a partire da zero, della prima corrispondenza. Controlla sempre il -1 prima di usare il risultato come indice, perché Substring(-1) lancia un'eccezione e Substring(-1 + 1) restituisce silenziosamente l'intera stringa. LastIndexOf funziona allo stesso modo, cercando dalla fine.

Come inverto una stringa in C#?

Copiala in un array di char, inverti l'array e crea una nuova stringa: char[] a = s.ToCharArray(); Array.Reverse(a); string r = new string(a);. Con LINQ, new string(s.Reverse().ToArray()) fa lo stesso. Entrambi invertono le unità UTF-16, quindi emoji e accenti combinati possono uscire rovinati.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA