Partager via


Comment rechercher des chaînes

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

Le type de chaîne , qui est un alias pour la System.String classe, fournit de nombreuses méthodes utiles pour rechercher le contenu d’une chaîne. Parmi eux sont Contains, , StartsWith, EndsWithIndexOf, , LastIndexOf. La System.Text.RegularExpressions.Regex classe fournit un vocabulaire riche pour rechercher des modèles dans du texte. Dans cet article, vous allez apprendre ces techniques et comment choisir la meilleure méthode pour vos besoins.

Est-ce qu'une chaîne contient du texte ?

Les méthodes String.Contains, String.StartsWith, et String.EndsWith recherchent une chaîne de caractères pour un texte spécifique. L’exemple suivant montre chacune de ces méthodes et une variante qui utilise une recherche insensible à 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");
// Raw string literals can work here because the output doesn't begin with "
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 illustre un point important pour l’utilisation de ces méthodes. Les recherches sont sensibles à la casse par défaut. Vous utilisez la valeur d’énumération pour spécifier une recherche sans respect de la StringComparison.CurrentCultureIgnoreCase casse.

Où apparaît le texte recherché dans une chaîne ?

Les méthodes IndexOf et LastIndexOf recherchent également du texte dans des chaînes. Ces méthodes retournent l’emplacement du texte recherché. Si le texte est introuvable, ils retournent -1. L’exemple suivant montre une recherche pour la première et la dernière occurrence du mot « méthodes » et affiche le texte 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 à l’aide d’expressions régulières

La System.Text.RegularExpressions.Regex classe peut être utilisée pour rechercher des chaînes. Ces recherches peuvent être complexes, allant de modèles de texte simples à complexes.

L’exemple de code suivant recherche le mot « the » ou « their » dans une phrase, ignorant la casse. La méthode Regex.IsMatch statique effectue la recherche. Vous lui donnez la chaîne pour effectuer une recherche et un modèle de recherche. Dans ce cas, un troisième argument spécifie une recherche sans tenir compte de 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 suivant utilise un seul \, qui doit être remplacé par \\ dans une chaîne de caractères C#).

Motif Meaning
the mettre en correspondance le texte « the »
(eir)? correspondre à 0 ou 1 occurrence de « eir »
\s mettre en correspondance un caractère d’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 / Astuce

Les string méthodes sont généralement meilleures lorsque vous recherchez une chaîne exacte. Les expressions régulières sont meilleures lorsque vous recherchez un 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 dans un tableau. La validation exige que chaque chaîne soit mise en forme sous forme de numéro de téléphone : trois groupes de chiffres séparés par des tirets où les deux premiers groupes contiennent trois chiffres et le troisième groupe contient quatre chiffres. Le modèle de recherche utilise l’expression ^\\d{3}-\\d{3}-\\d{4}$régulière . Pour plus d’informations, consultez Le langage d’expression régulière - Informations de référence rapides.

Motif Meaning
^ correspond au début de la chaîne
\d{3} correspond exactement à trois chiffres
- correspond au caractère « - »
\d{4} correspond exactement à quatre chiffres
$ 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 modèle de recherche unique correspond à de nombreuses chaînes valides. Les expressions régulières sont mieux à rechercher ou à valider par rapport à un modèle, plutôt qu’à une seule chaîne de texte.

Voir aussi