Guide pratique pour faire des recherches dans des chaînes

Vous pouvez utiliser deux stratégies principales pour rechercher du texte dans des chaînes. Les méthodes de la classe String recherchent un texte spécifique. Les expressions régulières recherchent des modèles dans du texte.

Notes

Les exemples C# de cet article s’exécutent dans l’exécuteur et le terrain de jeu du code inline Try.NET. Sélectionnez le bouton Exécuter pour exécuter un exemple dans une fenêtre interactive. Une fois que vous avez exécuté le code, vous pouvez le modifier et exécuter le code modifié en resélectionnant Exécuter. La code modifié s’exécute dans la fenêtre interactive ou, si la compilation échoue, la fenêtre interactive affiche tous les messages d’erreur du compilateur C#.

Le type string, qui est un alias de la classe System.String, propose un certain nombre de méthodes utiles pour rechercher le contenu d’une chaîne. En voici quelques-unes : Contains, StartsWith, EndsWith, IndexOf, LastIndexOf. La classe System.Text.RegularExpressions.Regex fournit un vocabulaire étendu pour rechercher des modèles dans du texte. Dans cet article, vous découvrez ces techniques et comment choisir la meilleure méthode pour vos besoins.

Une chaîne contient-elle un certain texte ?

Les méthodes String.Contains, String.StartsWith, et String.EndsWith recherchent un texte spécifique dans une chaîne. L’exemple suivant montre chacune de ces méthodes et une variante qui utilise une recherche sans respecter la casse :

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’exemple précédent montre un point important de l’utilisation de ces méthodes. Par défaut, les recherches respectent la casse. Vous utilisez la valeur d’énumération StringComparison.CurrentCultureIgnoreCase pour spécifier une recherche qui ne respecte pas la casse.

Où le texte recherché se trouve-t-il dans une chaîne ?

Les méthodes IndexOf et LastIndexOf recherchent aussi du texte dans des chaînes. Ces méthodes retournent l’emplacement du texte recherché. Si le texte n’est pas trouvé, elles retournent -1. L’exemple suivant montre une recherche de la première et de la dernière occurrence du mot « methods » et affiche le texte qui se trouve entre les deux.

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}'");

Recherche de texte spécifique en utilisant des expressions régulières

La classe System.Text.RegularExpressions.Regex permet d’effectuer des recherches de chaînes. Ces recherches peuvent varier en complexité et aller de modèles simples à des modèles plus compliqués.

L’exemple de code suivant recherche le mot « the » ou « their » dans une phrase, indépendamment de la casse. La méthode statique Regex.IsMatch effectue la recherche. Vous lui passez la chaîne à rechercher et un modèle de recherche. Dans ce cas, un troisième argument spécifie que la recherche est insensible à la casse. Pour plus d’informations, consultez System.Text.RegularExpressions.RegexOptions.

Le modèle de recherche décrit le texte que vous recherchez. Le tableau suivant décrit chaque élément du modèle de recherche. (Le tableau ci-dessous utilise une barre oblique inversée [\] qui, dans une chaîne C#, doit être précédée d’un caractère d’échappement sous la forme \\).

Modèle Signification
the correspond au texte « the »
(eir)? correspond à 0 ou 1 occurrence de « eir »
\s correspond à un espace blanc
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();
    }
}

Conseil

Les méthodes string sont généralement de meilleurs choix quand vous recherchez une chaîne précise. Les expressions régulières sont mieux adaptées quand vous recherchez un certain modèle dans une chaîne source.

Une chaîne suit-elle un modèle ?

Le code suivant utilise des expressions régulières pour valider le format de chaque chaîne d’un tableau. La validation doit vérifier que chaque chaîne a la forme d’un numéro de téléphone constitué de trois groupes de chiffres séparés par des tirets, les deux premiers groupes contenant trois chiffres et le troisième en contenant quatre. Le modèle de recherche utilise l’expression régulière ^\\d{3}-\\d{3}-\\d{4}$. Pour plus d’informations, consultez Langage des expressions régulières - Aide-mémoire.

Modèle Signification
^ correspond au début de la chaîne
\d{3} correspond à exactement 3 caractères numériques
- correspond au caractère « - ».
\d{4} correspond à exactement 4 caractères numériques
$ correspond à la fin de la chaîne
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");
    }
}

Ce seul modèle de recherche correspond à de nombreuses chaînes valides. Les expressions régulières sont mieux adaptées pour rechercher un modèle ou pour effectuer une validation par rapport à un modèle, et le sont moins pour une seule chaîne de texte.

Voir aussi