Sdílet prostřednictvím


Jak hledat řetězce

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

Poznámka:

Příklady jazyka C# v tomto článku se spouštějí v Try.NET inline code runner a playground. Vyberte tlačítko Spustit a spusťte příklad v interaktivním okně. Jakmile kód spustíte, můžete ho upravit a spustit upravený kód tak , že znovu vyberete Spustit . Upravený kód se buď spustí v interaktivním okně, nebo pokud kompilace selže, zobrazí se v interaktivním okně všechny chybové zprávy kompilátoru jazyka C#.

Typ řetězce , což je alias pro System.String třídu, poskytuje řadu užitečných metod pro vyhledávání obsahu řetězce. Mezi nimi jsou Contains, , EndsWithStartsWith, 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.StartsWitha String.EndsWith metody hledat ř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");
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í rozlišují malá a velká písmena . 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?

Tyto IndexOf metody 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 "jejich" ve větě a ignoruje malá a velká 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 na webu 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 Význam
the odpovídá textu "the"
(eir)? shoda 0 nebo 1 výskytu "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();
    }
}

Tip

Metody string jsou obvykle lepšími volbami 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 každý řetězec měl tvar telefonního čísla, ve kterém jsou tři skupiny číslic odděleny pomlčkami, 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 Význam
^ odpovídá začátku řetězce.
\d{3} Odpovídá přesně 3místným znakům.
- odpovídá znaku -.
\d{4} Odpovídá přesně 4mí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ší hledat nebo ověřovat podle vzoru, a ne s jedním textovým řetězcem.

Viz také