Suchzeichenfolgen in C#

Tip

Dieser Artikel ist Teil des Abschnitts "Grundlagen" für Entwickler, die bereits mindestens eine Programmiersprache kennen und C# erlernen. Wenn Sie noch nicht mit der Programmierung vertraut sind, beginnen Sie zuerst mit den Lernprogrammen " Erste Schritte ".

Kommen Sie aus einer anderen Sprache? C#-string-Methoden wie Contains, StartsWith und IndexOf entsprechen parallelen Methoden in Javas String und JavaScripts String.prototype. Der Hauptunterschied besteht darin, dass bei einigen C#-Suchvorgängen standardmäßig ein ordinaler, nach Groß-/Kleinschreibung unterscheidender Vergleich verwendet wird. Andere verwenden standardmäßig die Semantik der aktuellen Kultur. Bei benutzerorientierten Suchvorgängen möchten Sie möglicherweise einen StringComparison Wert übergeben.

Die String Klasse enthält Methoden, die zwei alltägliche Fragen beantworten:

Komplexere Such- und Ersetzungsalgorithmen können mit regulären Ausdrücken erstellt werden. Weitere Informationen zu regulären Ausdrücken und anderen Zeichenfolgenvorgängen finden Sie im Sprachreferenzartikel zu Zeichenfolgenvorgängen.

Überprüfen, ob eine Zeichenfolge Text enthält

Verwenden Sie Contains, StartsWith oder EndsWith, um das Vorhandensein einer Teilzeichenfolge zu prüfen:

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

Diese Methoden verwenden standardmäßig einen ordinalen, nach Groß- und Kleinschreibung unterscheidenden Vergleich. Um Benutzereingaben zu akzeptieren oder die Groß-/Kleinschreibung bei Anzeigetext zu ignorieren, übergeben Sie einen StringComparison-Wert wie StringComparison.CurrentCultureIgnoreCase oder StringComparison.OrdinalIgnoreCase.

Wenn Sie nach einem einzelnen Zeichen suchen, verwenden Sie die Überladung char von Contains. Dadurch wird vermieden, eine einstellige Zeichenfolge zu zuordnen und ist direkter:

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

Ermitteln Sie die Position des Textes

IndexOf gibt den nullbasierten Index des ersten Vorkommens einer Teilzeichenfolge (oder eines Zeichens) zurück und LastIndexOf gibt den Index des letzten Vorkommens zurück. Beide geben -1 zurück, wenn der Suchtext nicht vorhanden ist. Kombinieren Sie sie, um den Text zwischen zwei Markierungen zu extrahieren:

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 '

Wenn Sie nicht das erste oder letzte, sondern jedes Vorkommen benötigen, iterieren Sie, indem Sie das vorherige Ergebnis plus eins als startIndex-Argument übergeben, oder wechseln Sie zu einem regulären Ausdruck.

Auswählen des richtigen Vergleichs

Die meisten Suchüberladungen akzeptieren einen optionalen StringComparison Wert. Wählen Sie sie basierend auf der Art der gesuchten Daten aus:

  • Wenn Sie Bezeichner, Dateipfade, Protokolltoken oder alles andere computerdefiniert durchsuchen, verwenden Sie Ordinal.
  • Wenn Sie nach derselben Art von maschinendefinierten Daten suchen, dabei aber die Groß-/Kleinschreibung nicht beachten möchten, verwenden Sie OrdinalIgnoreCase.
  • Wenn Sie den vom Benutzer sichtbaren Text durchsuchen, auf den die Regeln des aktuellen Gebietsschemas angewendet werden sollen, verwenden Sie CurrentCulture.
  • Wenn Sie nach demselben für den Benutzer sichtbaren Text suchen und dabei die Groß-/Kleinschreibung ignorieren möchten, verwenden Sie CurrentCultureIgnoreCase.
  • Wenn Sie gespeicherte Daten durchsuchen, die bei Vergleichen auf jedem Computer und in jeder Kultur gleich behandelt werden müssen, verwenden Sie InvariantCulture (selten nötig).

Der Ordinalvergleich ist die schnellste Option und der richtige Standardwert für alles, was kein natürlicher Text ist. Kulturbewusster Vergleich ist deutlich langsamer und kann überraschende Ergebnisse erzielen. Zum Beispiel entspricht in einigen Kulturen der Kleinbuchstabe i nicht dem Großbuchstaben I. Verwenden Sie sie nur für Suchen in Fließtext, die Benutzer durchführen.

Eine ausführliche Erläuterung zum kultursensitiven Vergleich finden Sie unter Bewährte Methoden zum Vergleichen von Zeichenfolgen.

Siehe auch