Stringhe di ricerca in C#

Suggerimento

Questo articolo fa parte della sezione Nozioni fondamentali per gli sviluppatori che già conoscono almeno un linguaggio di programmazione e stanno imparando C#. Se non si ha familiarità con la programmazione, iniziare prima con le esercitazioni introduttive .

Venire da un'altra lingua? I metodi C# string, come Contains, StartsWith e IndexOf, trovano corrispondenza in metodi paralleli in String di Java e in String.prototype di JavaScript. La differenza fondamentale è che per alcune ricerche in C# il confronto predefinito è ordinale e con distinzione tra maiuscole e minuscole. Altri usano per impostazione predefinita la semantica delle impostazioni cultura correnti. Per le ricerche rivolte agli utenti, potrebbe essere necessario passare un StringComparison valore.

La String classe include metodi che rispondono a due domande quotidiane:

È possibile creare algoritmi di ricerca e sostituzione più complessi usando espressioni regolari. Per altre informazioni sulle espressioni regolari e altre operazioni su stringhe, vedere l'articolo di riferimento sul linguaggio sulle operazioni stringhe.

Controllare se una stringa contiene testo

Usare Contains, StartsWitho EndsWith per verificare la presenza di una sottostringa:

string factMessage = "Extension methods have all the capabilities of regular static methods.";

// Write the string and include the quotation marks.
Console.WriteLine($"\"{factMessage}\"");

// Default comparisons are case sensitive.
bool containsSearchResult = factMessage.Contains("extension");
Console.WriteLine($"""Contains "extension"? {containsSearchResult}""");

// For user-facing searches, pass a StringComparison value to control case and culture.
bool ignoreCaseSearchResult = factMessage.StartsWith("extension", StringComparison.CurrentCultureIgnoreCase);
Console.WriteLine($"""Starts with "extension"? {ignoreCaseSearchResult} (ignoring case)""");

bool endsWithSearchResult = factMessage.EndsWith(".", StringComparison.Ordinal);
Console.WriteLine($"Ends with '.'? {endsWithSearchResult}");
// => "Extension methods have all the capabilities of regular static methods."
// => Contains "extension"? False
// => Starts with "extension"? True (ignoring case)
// => Ends with '.'? True

Per impostazione predefinita, questi metodi usano il confronto ordinale con distinzione tra maiuscole e minuscole. Per accettare l'input dell'utente o ignorare la distinzione tra maiuscole e minuscole per il testo visualizzato, passare un StringComparison valore come StringComparison.CurrentCultureIgnoreCase o StringComparison.OrdinalIgnoreCase.

Quando si cerca un singolo carattere, usare l'overload char di Contains. Evita di allocare una stringa di un carattere ed è più diretto:

string path = "/usr/local/bin";
bool hasSlash = path.Contains('/');
Console.WriteLine($"Path contains '/': {hasSlash}");
// => Path contains '/': True

Individuare la posizione del testo

IndexOf restituisce l'indice in base zero della prima occorrenza di una sottostringa (o carattere) e LastIndexOf restituisce l'indice dell'ultima occorrenza. Entrambi restituiscono -1 quando il testo di ricerca non è presente. Combinarli per estrarre il testo tra due marcatori:

string factMessage = "Extension methods have all the capabilities of regular static methods.";

Console.WriteLine($"\"{factMessage}\"");

// Extract the text between the first and last occurrence of "methods".
int first = factMessage.IndexOf("methods") + "methods".Length;
int last = factMessage.LastIndexOf("methods");
string between = factMessage.Substring(first, last - first);
Console.WriteLine($"""Substring between "methods" and "methods": '{between}'""");
// => "Extension methods have all the capabilities of regular static methods."
// => Substring between "methods" and "methods": ' have all the capabilities of regular static '

Quando è necessaria ogni occorrenza anziché la prima o l'ultima, eseguire l'iterazione passando il risultato precedente più uno come argomento o passando a un'espressione startIndex regolare.

Scegliere il confronto corretto

La maggior parte degli overload della ricerca accetta un valore facoltativo StringComparison. Selezionarlo in base al tipo di dati che si sta cercando:

  • Se si esegue la ricerca di identificatori, percorsi di file, token di protocollo o qualsiasi altro elemento definito dal computer, usare Ordinal.
  • Se si esegue una ricerca nello stesso tipo di dati definiti dal computer, ma si vuole insensibilità tra maiuscole e minuscole, usare OrdinalIgnoreCase.
  • Se si sta cercando testo visibile all'utente in cui devono essere applicate le regole delle impostazioni locali correnti, usare CurrentCulture.
  • Se si esegue una ricerca nello stesso testo visibile dall'utente e si vuole ignorare la distinzione tra maiuscole e minuscole, usare CurrentCultureIgnoreCase.
  • Se si esegue la ricerca di dati persistenti che devono essere confrontati nello stesso computer e in tutte le impostazioni cultura, usare InvariantCulture (raramente necessario).

Il confronto ordinale è l'opzione più veloce e il valore predefinito corretto per qualsiasi elemento che non sia testo in linguaggio naturale. Il confronto con riconoscimento della cultura è notevolmente più lento e può produrre risultati sorprendenti. Ad esempio, in alcune impostazioni locali la lettera minuscola i non corrisponde alla lettera maiuscola I. Riservalo alle ricerche che gli utenti eseguono sul testo discorsivo.

Per una trattazione approfondita del confronto dipendente dalle impostazioni cultura, vedere Procedure consigliate per il confronto delle stringhe.

Vedere anche