Vorgehensweise: Durchsuchen von Zeichenfolgen

Sie können zwei Strategien verwenden, um in Zeichenfolgen nach Text zu suchen. Methoden der String-Klasse suchen nach einem bestimmten Text. Reguläre Ausdrücke suchen nach Mustern im Text.

Hinweis

Die C#-Beispiele in diesem Artikel werden in der Inlinecodeausführung und dem Playground von Try.NET ausgeführt. Klicken Sie auf die Schaltfläche Ausführen, um ein Beispiel in einem interaktiven Fenster auszuführen. Nachdem Sie den Code ausgeführt haben, können Sie ihn ändern und den geänderten Code durch erneutes Anklicken der Schaltfläche Ausführen ausführen. Der geänderte Code wird entweder im interaktiven Fenster ausgeführt, oder das interaktive Fenster zeigt alle C#-Compilerfehlermeldungen an, wenn die Kompilierung fehlschlägt.

Der Zeichenfolgen-Typ, der ein Alias für die Klasse System.String ist, enthält eine Reihe nützlicher Methoden, um den Inhalt einer Zeichenfolge zu durchsuchen. Dazu zählen Contains, StartsWith, EndsWith, IndexOf, LastIndexOf. Die System.Text.RegularExpressions.Regex-Klasse bietet ein umfangreiches Vokabular zum Suchen nach Mustern im Text. In diesem Artikel lernen Sie diese Techniken kennen und erfahren, wie Sie die am besten geeignete Methode für Ihre Anforderungen auswählen.

Enthält eine Zeichenfolge Text?

Die Methoden String.Contains, String.StartsWith und String.EndsWith durchsuchen eine Zeichenfolge nach einem bestimmten Text. Das folgende Beispiel zeigt jede dieser Methoden und eine Variante, die einen Suchvorgang verwendet, bei dem die Groß-/Kleinschreibung nicht beachtet wird:

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");
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}");

Das obige Beispiel veranschaulicht eine wichtigen Aspekt bei der Verwendung dieser Methoden. Bei Suchvorgängen wird standardmäßig die Groß-/Kleinschreibung beachtet. Verwenden Sie den Enumerationswert StringComparison.CurrentCultureIgnoreCase, um einen Suchvorgang anzugeben, bei dem die Groß-/Kleinschreibung nicht beachtet wird.

An welcher Stelle einer Zeichenfolge befindet sich der gesuchte Text ?

Die Methoden IndexOf und LastIndexOf suchen ebenfalls nach Text in Zeichenfolgen. Diese Methoden geben die Position des gesuchten Texts zurück. Wenn der Text nicht gefunden wird, geben sie -1 zurück. Das folgende Beispiel sucht nach dem ersten und letzten Vorkommen des Worts „methods“ und zeigt den Text dazwischen an.

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}'");

Suchen nach einem bestimmten Text mithilfe von regulären Ausdrücken

Die System.Text.RegularExpressions.Regex-Klasse kann zum durchsuchen von Zeichenfolgen verwendet werden. Die Komplexität dieser Suchvorgänge reicht von sehr einfachen bis hin zu komplizierten Textmustern.

Das folgende Codebeispiel sucht nach dem Wort „the“ oder „their“ in einem Satz, die Groß-/Kleinschreibung wird ignoriert. Die statische Methode Regex.IsMatch führt die Suche aus. Die zu durchsuchende Zeichenfolge und ein Suchmuster werden an die Methode übergeben. In diesem Fall gibt ein drittes Argument an, dass die Groß-/Kleinschreibung nicht beachtet werden soll. Weitere Informationen finden Sie unter System.Text.RegularExpressions.RegexOptions.

Das Suchmuster beschreibt den Text, nach dem Sie suchen. In der folgenden Tabelle werden die einzelnen Elemente des Suchmusters beschrieben. (In der folgenden Tabelle wird ein einzelnes \-Zeichen verwendet. Dieses muss in einer C#-Zeichenfolge durch das Escapezeichen \\ ersetzt werden.)

Muster Bedeutung
the Findet den Text „the“.
(eir)? Findet 0 oder 1 Vorkommen von „eir“.
\s Findet Zeichen für Leerraum.
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();
    }
}

Tipp

Die string-Methoden sind bei der Suche nach einer genauen Zeichenfolge in der Regel die bessere Wahl. Reguläre Ausdrücke eignen sich besser, wenn Sie nach einem bestimmten Muster in einer Quellzeichenfolge suchen.

Folgt eine Zeichenfolge einem Muster?

Der folgende Code verwendet reguläre Ausdrücke, um das Format jeder Zeichenfolge in einem Array zu überprüfen. Für die Überprüfung ist erforderlich, dass jede Zeichenfolge die Form einer Telefonnummer aufweist, in der drei Gruppen von Ziffern durch Bindestriche getrennt sind, wobei die ersten beiden Gruppen je drei Ziffern enthalten und die dritte Gruppe vier Ziffern umfasst. Das Suchmuster verwendet den regulären Ausdruck ^\\d{3}-\\d{3}-\\d{4}$. Weitere Informationen finden Sie unter Sprachelemente für reguläre Ausdrücke – Kurzübersicht.

Muster Bedeutung
^ Findet den Anfang der Zeichenfolge.
\d{3} Findet genau 3 Ziffernzeichen.
- Findet das Zeichen „-“.
\d{4} Findet genau 4 Ziffernzeichen.
$ Findet das Ende der Zeichenfolge.
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");
    }
}

Dieses einzelne Suchmuster findet alle gültigen Zeichenfolgen. Reguläre Ausdrücke eignen sich besser zum Suchen nach Mustern oder zum Überprüfen von Zeichenfolgen anhand eines Musters als für einzelne Zeichenfolgen.

Siehe auch