Chaînes de recherche en C#

Conseil / Astuce

Cet article fait partie de la section Notions de base pour les développeurs qui connaissent déjà au moins un langage de programmation et apprennent C#. Si vous débutez avec la programmation, commencez par commencer par les didacticiels De prise en main .

Venant d’une autre langue ? Les méthodes C# string, telles que Contains, StartsWith et IndexOf, ont pour équivalents les méthodes de Java String et de JavaScript String.prototype. La principale différence est que certaines recherches C# utilisent par défaut une comparaison ordinale et sensible à la casse. D’autres utilisent par défaut la sémantique de la culture actuelle. Pour les recherches destinées aux utilisateurs, il peut être utile de transmettre une valeur StringComparison.

La String classe comprend des méthodes qui répondent à deux questions quotidiennes :

Des algorithmes de recherche et de remplacement plus complexes peuvent être créés à l’aide d’expressions régulières. Pour plus d’informations sur les expressions régulières et d’autres opérations de chaîne, consultez l’article de référence du langage sur les opérations de chaîne.

Vérifier si une chaîne contient du texte

Utilisez Contains, StartsWithou EndsWith pour tester la présence d’une sous-chaîne :

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

Ces méthodes utilisent par défaut la comparaison ordinale sensible à la casse. Pour accepter l’entrée utilisateur ou ignorer la casse du texte d’affichage, transmettez une StringComparison valeur telle que StringComparison.CurrentCultureIgnoreCase ou StringComparison.OrdinalIgnoreCase.

Lorsque vous recherchez un caractère unique, utilisez la surcharge char de Contains. Il évite d’allouer une chaîne à caractère unique et est plus direct :

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

Localiser la position du texte

IndexOf retourne l’index de base zéro de la première occurrence d’une sous-chaîne (ou caractère) et LastIndexOf retourne l’index de la dernière occurrence. Les deux retournent -1 lorsque le texte de recherche n’est pas présent. Combinez-les pour extraire le texte entre deux marqueurs :

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 '

Lorsque vous avez besoin de chaque occurrence plutôt que du premier ou du dernier, effectuez une itération en passant le résultat précédent plus un comme startIndex argument, ou basculez vers une expression régulière.

Choisir la comparaison appropriée

La plupart des surcharges de recherche acceptent une valeur StringComparison facultative. Choisissez-la en fonction du type de données que vous recherchez :

  • Si vous recherchez des identificateurs, des chemins d’accès de fichier, des jetons de protocole ou tout autre élément défini par l’ordinateur, utilisez Ordinal.
  • Si vous recherchez le même type de données définies par la machine, mais souhaitez une recherche sans distinction entre majuscules et minuscules, utilisez OrdinalIgnoreCase.
  • Si vous recherchez du texte visible par l’utilisateur où les règles actuelles des paramètres régionaux doivent s’appliquer, utilisez CurrentCulture.
  • Si vous recherchez ce même texte visible par l’utilisateur et que vous souhaitez ignorer le cas, utilisez CurrentCultureIgnoreCase.
  • Si vous recherchez des données persistantes qui doivent être comparées sur chaque ordinateur et culture, utilisez InvariantCulture (rarement nécessaire).

La comparaison ordinale est l’option la plus rapide et la valeur par défaut appropriée pour tout ce qui n’est pas du texte en langage naturel. La comparaison sensible à la culture est beaucoup plus lente et peut produire des résultats surprenants. Par exemple, dans certaines cultures, la minuscule i ne correspond pas à une majuscule I. Réservez-le pour les recherches que les utilisateurs effectuent sur prose.

Pour une présentation détaillée de la comparaison respectant la culture, consultez Bonnes pratiques pour comparer des chaînes.

Voir aussi