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.