Söksträngar i C#

Tips/Råd

Den här artikeln är en del av avsnittet Grunderna för utvecklare som redan känner till minst ett programmeringsspråk och lär sig C#. Om du inte har använt programmering tidigare börjar du med självstudierna Komma igång först.

Kommer du från ett annat språk? C# string metoder som Contains, StartsWith och IndexOf motsvarar metoder i Java String och JavaScripts String.prototype. Den avgörande skillnaden är att vissa C#-sökningar som standard använder jämförelse av typen ordinal, skiftlägeskänslig. Andra använder den aktuella kulturens semantik som standard. För användarriktade sökningar kanske du vill skicka ett StringComparison värde.

Klassen String innehåller metoder som besvarar två vardagliga frågor:

Mer komplexa sök- och ersättningsalgoritmer kan skapas med reguljära uttryck. Mer information om reguljära uttryck och andra strängåtgärder finns i språkreferensartikeln om strängåtgärder.

Kontrollera om en sträng innehåller text

Använd Contains, StartsWitheller EndsWith för att testa om det finns en delsträng:

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

Dessa metoder använder som standard skiftlägeskänslig, ordinal jämförelse. Om du vill acceptera användarindata eller ignorera skiftläge för visningstext, anger du ett värde för StringComparison som StringComparison.CurrentCultureIgnoreCase eller StringComparison.OrdinalIgnoreCase.

När du söker efter ett enskilt tecken använder du den överlagrade versionen av Contains, char. Den undviker allokering av en sträng med ett tecken och är mer direkt:

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

Leta upp textpositionen

IndexOf returnerar det nollbaserade indexet för den första förekomsten av en delsträng (eller ett tecken) och LastIndexOf returnerar indexet för den senaste förekomsten. Båda returnerar -1 när söktexten inte finns. Kombinera dem för att extrahera texten mellan två markörer:

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 '

När du behöver varje förekomst i stället för den första eller sista itererar du genom att skicka föregående resultat plus ett som startIndex argument, eller växla till ett reguljärt uttryck.

Välj rätt jämförelse

De flesta sököverlagringar har stöd för ett valfritt StringComparison-värde. Välj den baserat på vilken typ av data du söker efter:

  • Om du söker efter identifierare, filsökvägar, protokolltoken eller något annat datordefinierat använder du Ordinal.
  • Om du söker efter samma typ av maskindefinierade data men vill ha ingen skiftlägeskänslighet kan du använda OrdinalIgnoreCase.
  • Om du söker i användarsynlig text där det aktuella språkets regler ska tillämpas, använd CurrentCulture.
  • Om du söker efter samma användarsynliga text och vill ignorera skiftläge, använder du CurrentCultureIgnoreCase.
  • Om du söker efter bevarade data som måste jämföra samma på varje dator och kultur använder du InvariantCulture (behövs sällan).

Ordinal jämförelse är det snabbaste alternativet och det rätta standardvalet för allt som inte är naturlig språktext. Kulturmedveten jämförelse är betydligt långsammare och kan ge överraskande resultat. I vissa kulturer motsvarar till exempel inte gemenen i versalen I. Reservera det för sökningar som användare utför i löptext.

En djupgående behandling av kulturmedveten jämförelse finns i Metodtips för att jämföra strängar.

Se även