Zoekreeksen in C#

Aanbeveling

Dit artikel maakt deel uit van de sectie Grondbeginselen voor ontwikkelaars die al ten minste één programmeertaal kennen en C# leren. Als u nieuw bent in programmeren, begint u eerst met de Aan de slag-handleidingen.

Komt u uit een andere taal? C# string methoden zoals Contains, StartsWith en IndexOf komen overeen met parallelle methoden in Java String en JavaScript's String.prototype. Het belangrijkste verschil is dat sommige C#-zoekopdrachten standaard worden gebruikt voor ordinale, hoofdlettergevoelige vergelijking. Anderen zijn standaard ingesteld op de semantiek van de huidige cultuur. Voor gebruikersgerichte zoekopdrachten wilt u mogelijk een StringComparison waarde doorgeven.

De String klasse bevat methoden die twee dagelijkse vragen beantwoorden:

Complexere zoek- en vervangingsalgoritmen kunnen worden gebouwd met behulp van reguliere expressies. Zie het naslagartikel over tekenreeksbewerkingen voor meer informatie over reguliere expressies en andere tekenreeksbewerkingen.

Controleren of een tekenreeks tekst bevat

Gebruik Contains, StartsWith of EndsWith om te testen op de aanwezigheid van een subtekenreeks:

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

Deze methoden vergelijken standaard met een hoofdlettergevoelige, ordinale vergelijking. Als u gebruikersinvoer wilt accepteren of hoofdletters wilt negeren voor weergavetekst, geeft u een StringComparison waarde door, zoals StringComparison.CurrentCultureIgnoreCase of StringComparison.OrdinalIgnoreCase.

Wanneer u op één teken zoekt, gebruikt u de char-overload van Contains. Het voorkomt het aanmaken van een tekenreeks van één teken en is directer:

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

De positie van tekst zoeken

IndexOf retourneert de op nul gebaseerde index van het eerste exemplaar van een subtekenreeks (of teken) en LastIndexOf retourneert de index van het laatste exemplaar. Beide retourneren -1 wanneer de zoektekst niet aanwezig is. Combineer deze om de tekst tussen twee markeringen te extraheren:

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 '

Wanneer u elk exemplaar nodig hebt in plaats van het eerste of laatste, kunt u het vorige resultaat herhalen door het vorige resultaat plus één als argument startIndex door te geven of over te schakelen naar een reguliere expressie.

De juiste vergelijking kiezen

De meeste zoekoverbelastingen accepteren een optionele StringComparison waarde. Kies deze op basis van het soort gegevens dat u zoekt:

  • Als u id's, bestandspaden, protocoltokens of iets anders door een computer gedefinieerd zoekt, gebruikt u Ordinal.
  • Als u naar hetzelfde soort machinegedefinieerde gegevens zoekt maar niet hoofdlettergevoelig wilt zoeken, gebruikt u OrdinalIgnoreCase.
  • Als u voor de gebruiker zichtbare tekst doorzoekt waarop de regels van de huidige landinstellingen van toepassing moeten zijn, gebruikt u CurrentCulture.
  • Als u in dezelfde door de gebruiker zichtbare tekst zoekt en hoofdletters wilt negeren, gebruikt u CurrentCultureIgnoreCase.
  • Als u persistente gegevens doorzoekt die op elke computer en in elke cultuur op dezelfde manier moeten worden vergeleken, gebruikt u InvariantCulture (zelden nodig).

Ordinale vergelijking is de snelste optie en de juiste standaardinstelling voor alles wat geen tekst in natuurlijke taal is. Cultuurbewuste vergelijking is aanzienlijk langzamer en kan verrassende resultaten opleveren. In sommige culturen komt de kleine letter i bijvoorbeeld niet overeen met een hoofdletter I. Reserveer deze voor zoekopdrachten die gebruikers uitvoeren op proza.

Voor een diepgaande bespreking van cultuurafhankelijke vergelijkingen, zie Aanbevolen procedures voor het vergelijken van tekenreeksen.

Zie ook