Jak prohledávat řetězce

K hledání textu v řetězcích můžete použít dvě hlavní strategie. Metody třídy String vyhledávají konkrétní text. Regulární výrazy vyhledávají vzory v textu.

Typ řetězce , což je alias pro System.String třídu, poskytuje mnoho užitečných metod pro vyhledávání obsahu řetězce. Mezi nimi jsou Contains, , StartsWithEndsWith, IndexOf, LastIndexOf. Třída System.Text.RegularExpressions.Regex poskytuje bohatou slovní zásobu pro hledání vzorů v textu. V tomto článku se naučíte tyto techniky a jak si vybrat nejlepší metodu pro vaše potřeby.

Obsahuje řetězec text?

The String.Contains, String.StartsWith a String.EndsWith metody hledají řetězec pro určitý text. Následující příklad ukazuje každou z těchto metod a variantu, která používá vyhledávání bez rozlišování malých a velkých písmen:

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");
// Raw string literals can work here because the output doesn't begin with "
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}");

Předchozí příklad ukazuje důležitý bod pro použití těchto metod. Hledání ve výchozím nastavení jsou citlivá na velikost písmen. Hodnotu výčtu StringComparison.CurrentCultureIgnoreCase použijete k určení vyhledávání bez rozlišování velkých a malých písmen.

Kde se hledaný text vyskytuje v řetězci?

Metody IndexOf a LastIndexOf také vyhledávají text v řetězcích. Tyto metody vrátí umístění hledaného textu. Pokud se text nenajde, vrátí -1. Následující příklad ukazuje hledání prvního a posledního výskytu slova "methods" a zobrazí text mezi.

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

Vyhledání konkrétního textu pomocí regulárních výrazů

Třídu System.Text.RegularExpressions.Regex lze použít k vyhledávání řetězců. Tato hledání můžou být složitá od jednoduchých až komplikovaných vzorů textu.

Následující příklad kódu vyhledá slovo "the" nebo "their" ve větě, aniž by rozlišoval velká a malá písmena. Statická metoda Regex.IsMatch provádí vyhledávání. Dáte mu řetězec, který se má prohledávat, a vzor hledání. V tomto případě třetí argument určuje vyhledávání bez rozlišování velkých a malých písmen. Další informace najdete v tématu System.Text.RegularExpressions.RegexOptions.

Vzor hledání popisuje hledaný text. Následující tabulka popisuje jednotlivé prvky vzoru vyhledávání. (Následující tabulka používá jeden \, který musí být uvozován jako \\ v řetězci jazyka C#).

Vzor Meaning
the odpovídá textu "the"
(eir)? shoda s 0 nebo 1 výskytem "eir"
\s Shoda s prázdným znakem
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();
    }
}

Návod

Metody string obvykle představují lepší volbu při hledání přesného řetězce. Regulární výrazy jsou lepší, když hledáte nějaký vzor ve zdrojovém řetězci.

Dodržuje řetězec vzor?

Následující kód používá regulární výrazy k ověření formátu každého řetězce v poli. Ověření vyžaduje, aby byl každý řetězec formátován jako telefonní číslo: tři skupiny číslic oddělených pomlčkami, kde první dvě skupiny obsahují tři číslice a třetí skupina obsahuje čtyři číslice. Hledaný vzor používá regulární výraz ^\\d{3}-\\d{3}-\\d{4}$. Další informace naleznete v tématu Jazyk regulárních výrazů – stručná referenční dokumentace.

Vzor Meaning
^ Odpovídá začátku řetězce.
\d{3} Odpovídá přesně třem číslicným znakům.
- Odpovídá znaku -.
\d{4} Odpovídá přesně čtyřmístným znakům.
$ Odpovídá konci řetězce.
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");
    }
}

Tento jediný vzor hledání odpovídá mnoha platným řetězcům. Regulární výrazy jsou lepší pro hledání nebo ověřování podle vzoru než pro práci s jednotlivým textovým řetězcem.

Viz také