Come cercare stringhe

È possibile usare due strategie principali per la ricerca del testo nelle stringhe. I metodi della classe String consentono di cercare testo specifico. Le espressioni regolari consentono di cercare modelli nel testo.

Nota

Gli esempi in C# in questo articolo vengono eseguiti nello strumento di esecuzione e playground per codice inline Try.NET. Selezionare il pulsante Esegui per eseguire un esempio in una finestra interattiva. Dopo aver eseguito il codice, è possibile modificarlo ed eseguire il codice modificato selezionando di nuovo Esegui. Il codice modificato viene eseguito nella finestra interattiva o, se la compilazione non riesce, la finestra interattiva visualizza tutti i messaggi di errore del compilatore C#.

Il tipo string, che è un alias per la classe System.String, fornisce diversi metodi utili per la ricerca dei contenuti di una stringa. Alcuni di questi sono Contains, StartsWith, EndsWith, IndexOf e LastIndexOf. La classe System.Text.RegularExpressions.Regex offre un vocabolario avanzato per la ricerca di modelli nel testo. In questo articolo vengono illustrate queste tecniche e viene spiegato come scegliere il metodo migliore per le specifiche esigenze.

Una stringa contiene testo?

I metodi String.Contains, String.StartsWith e String.EndsWith cercano testo specifico in una stringa. L'esempio seguente illustra ognuno di questi metodi e una variante che usa una ricerca senza distinzione tra maiuscole e minuscole:

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

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

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

// For user input and strings that will be displayed to the end user,
// use the StringComparison parameter on methods that have it to specify how to match strings.
bool ignoreCaseSearchResult = factMessage.StartsWith("extension", System.StringComparison.CurrentCultureIgnoreCase);
Console.WriteLine($"Starts with \"extension\"? {ignoreCaseSearchResult} (ignoring case)");

bool endsWithSearchResult = factMessage.EndsWith(".", System.StringComparison.CurrentCultureIgnoreCase);
Console.WriteLine($"Ends with '.'? {endsWithSearchResult}");

L'esempio precedente dimostra un aspetto importante per l'uso di questi metodi. Le ricerche fanno distinzione tra maiuscole e minuscole per impostazione predefinita. Usare il valore di enumerazione StringComparison.CurrentCultureIgnoreCase per specificare una ricerca senza distinzione tra maiuscole e minuscole.

Qual è la posizione del testo cercato in una stringa?

Anche i metodi IndexOf e LastIndexOf consentono di cercare testo nelle stringhe. Questi metodi restituiscono la posizione del testo cercato. Se il testo non viene trovato, restituiscono -1. L'esempio seguente mostra una ricerca della prima e dell'ultima occorrenza della parola "methods" e visualizza il testo che intercorre.

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

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

// This search returns the substring between two strings, so
// the first index is moved to the character just after the first string.
int first = factMessage.IndexOf("methods") + "methods".Length;
int last = factMessage.LastIndexOf("methods");
string str2 = factMessage.Substring(first, last - first);
Console.WriteLine($"Substring between \"methods\" and \"methods\": '{str2}'");

Ricerca di testo specifico con espressioni regolari

La classe System.Text.RegularExpressions.Regex può essere usata per eseguire la ricerca di stringhe. Queste ricerche possono usare modelli di testo semplici, ma anche piuttosto complicati.

L'esempio di codice seguente cerca la parola "the" o "their" in una frase, ignorando la combinazione di maiuscole e minuscole. Il metodo statico Regex.IsMatch esegue la ricerca. È necessario passare la stringa da cercare e i criteri di ricerca. In questo caso, un terzo argomento specifica una ricerca senza distinzione tra maiuscole e minuscole. Per ulteriori informazioni, vedere System.Text.RegularExpressions.RegexOptions.

I criteri di ricerca descrivono il testo da cercare. La tabella seguente descrive ogni elemento dei criteri di ricerca. (Nella tabella seguente viene usata la barra singola \ per la quale è necessario l'escape come \\ in una stringa in C#).

Modello Significato
the corrisponde al testo "the"
(eir)? corrisponde a 0 o 1 occorrenza di "eir"
\s corrisponde a un carattere spazio vuoto
string[] sentences =
{
    "Put the water over there.",
    "They're quite thirsty.",
    "Their water bottles broke."
};

string sPattern = "the(ir)?\\s";

foreach (string s in sentences)
{
    Console.Write($"{s,24}");

    if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase))
    {
        Console.WriteLine($"  (match for '{sPattern}' found)");
    }
    else
    {
        Console.WriteLine();
    }
}

Suggerimento

I metodi string rappresentano in genere una scelta migliore per cercare stringhe esatte. Le espressioni regolari sono preferibili per la ricerca di un modello in una stringa di origine.

Una stringa segue un modello?

Il codice seguente usa le espressioni regolari per convalidare il formato di ogni stringa in una matrice. Per la convalida è necessario che ogni stringa abbia il formato di un numero di telefono costituito da tre gruppi di cifre separate da trattini, di cui i primi due gruppi contengono tre cifre e il terzo ne contiene quattro. I criteri di ricerca usano l'espressione regolare ^\\d{3}-\\d{3}-\\d{4}$. Per altre informazioni, vedere Linguaggio di espressioni regolari - Riferimento rapido.

Modello Significato
^ corrisponde all'inizio della stringa
\d{3} corrisponde esattamente a 3 caratteri numerici
- corrisponde al carattere '-'
\d{4} corrisponde esattamente a 4 caratteri numerici
$ corrisponde alla fine della stringa
string[] numbers =
{
    "123-555-0190",
    "444-234-22450",
    "690-555-0178",
    "146-893-232",
    "146-555-0122",
    "4007-555-0111",
    "407-555-0111",
    "407-2-5555",
    "407-555-8974",
    "407-2ab-5555",
    "690-555-8148",
    "146-893-232-"
};

string sPattern = "^\\d{3}-\\d{3}-\\d{4}$";

foreach (string s in numbers)
{
    Console.Write($"{s,14}");

    if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern))
    {
        Console.WriteLine(" - valid");
    }
    else
    {
        Console.WriteLine(" - invalid");
    }
}

Questo singolo criterio di ricerca corrisponde a molte stringhe valide. Le espressioni regolari sono preferibili per eseguire ricerche o convalide in base a un modello, anziché a una singola stringa di testo.

Vedi anche