Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.