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.
Tento článek se zabývá třemi řetězcovými operacemi: porovnávání vzorů regulárních výrazů s System.Text.RegularExpressions.Regex, vyhledáváním ReadOnlySpan<T>bez přidělení a výběrem StringComparison hodnoty pro správná, rychlá porovnání.
Vyhledání konkrétního textu pomocí regulárních výrazů
Třída System.Text.RegularExpressions.Regex vyhledává řetězce namísto pevných podřetězců. Statická Regex.IsMatch metoda přebírá vstupní řetězec, vzor a volitelné RegexOptions příznaky.
Následující příklad vyhledá každou větu pro slovo, které nerozlišuje malá a velká písmena. Vzor the(ir)?\s odpovídá the volitelně následovaný znakem irprázdného znaku:
| Pattern | Význam |
|---|---|
the |
shoda s textem literálu the |
(ir)? |
shoda 0 nebo 1 výskytu ir |
\s |
Shoda s prázdným znakem |
string[] sentences =
[
"Put the water over there.",
"They're quite thirsty.",
"Their water bottles broke."
];
string pattern = @"the(ir)?\s";
foreach (string s in sentences)
{
Console.Write($"{s,28}");
if (Regex.IsMatch(s, pattern, RegexOptions.IgnoreCase))
{
Console.WriteLine($" (match for '{pattern}' found)");
}
else
{
Console.WriteLine();
}
}
Ověření řetězců podle vzoru
Chcete-li zkontrolovat, zda celý vstup odpovídá obrazci, ukotvení vzoru s ^ a $. Následující příklad ověří, že každý řetězec je telefonní číslo ve stylu USA: tři číslice, tři číslice, čtyři číslice oddělené pomlčkami:
| Pattern | Význam |
|---|---|
^ |
odpovídá začátku řetězce. |
\d{3} |
Shoda přesně se třemi číslicemi |
- |
Shoda literálového - znaku |
\d{4} |
Shoda přesně se čtyřmi číslicemi |
$ |
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 pattern = """^\d{3}-\d{3}-\d{4}$""";
foreach (string s in numbers)
{
Console.Write($"{s,14}");
Console.WriteLine(Regex.IsMatch(s, pattern) ? " - valid" : " - invalid");
}
Úplnou syntaxi vzorů najdete v tématu Jazyk regulárních výrazů – stručná referenční příručka.
Volba mezi string metodami a regulárními výrazy
string
Regex a řeší překrývající se problémy. Upřednostňujte string metody, pokud je hledaný text literálovou hodnotou, známou předponou nebo příponou nebo pevným oddělovačem. Čtení a rychlejší je jednodušší, protože neplatí náklady na kompilaci a provádění vzoru.
Regex Pokud je cílem hledání obrazec, například alternace, volitelné skupiny, opakované třídy znaků nebo ukotvené ověření Obecně platí, že pokud můžete hledání napsat jako jedno nebo dvě string.Contains / / StartsWithIndexOf volání, udělejte to.
Hledání pomocí ReadOnlySpan<char>
Když analyzujete velké vstupy nebo spustíte hledání na horké cestě, přidělení string.Substring volání a string.Split může dominovat.
ReadOnlySpan<char> poskytuje zobrazení existujícího řetězce (nebo pole nebo vyrovnávací paměti zásobníku) bez kopírování a MemoryExtensions poskytuje ekvivalenty běžných string metod založených na rozsahu, včetně IndexOf:
ReadOnlySpan<char> input = "key1=alpha;key2=beta;key3=gamma".AsSpan();
ReadOnlySpan<char> needle = "key2=".AsSpan();
int start = input.IndexOf(needle);
if (start >= 0)
{
ReadOnlySpan<char> rest = input[(start + needle.Length)..];
int end = rest.IndexOf(';');
ReadOnlySpan<char> value = end >= 0 ? rest[..end] : rest;
Console.WriteLine($"key2 = {value}");
}
// => key2 = beta
Hledání založené na rozpětí zabraňuje přidělení, protože řezy (input[start..], rest[..end]) jsou jednoduše okna nad původními znaky. Stejný přístup se škáluje tak, aby parsoval seznamy klíč-hodnota, záhlaví a další text s oddělovači bez nutnosti volat Substring.
Důležité informace o výkonu pro StringComparison
Většina string metod instance má přetížení, které přijímají StringComparison hodnotu. Metody, jako String.Equals(String) je výchozí hodnota pro pořadové číslo, ale String.Compare(String, String) i String.IndexOf(String) výchozí pro aktuální jazykovou verzi. Tento rozdíl je důležitý dvěma způsoby:
- Rychlost. Pořadové porovnání je bajtový bajtový test, který běží v těsné vektorizované smyčce. Porovnání s jazykovou verzí se zabývá tabulkou řazení, průvodce kombinováním znaků a používá pravidla specifická pro národní prostředí. U stejného vstupu může být řádově pomalejší.
- Správnost. Porovnání s jazykovou verzí může skládat znaky, které neočekáváte (turečtina , němčina
iß/Inass, ligatury). Toto chování je správné pro řazení názvů, které uživatel vidí, ale není správné při analýze identifikátorů, cest nebo tokenů protokolu.
Pro strojově definovaný text, jako jsou názvy souborů, adresy URL, hlavičky HTTP, identifikátory a konfigurační klíče, předávat StringComparison.Ordinal nebo StringComparison.OrdinalIgnoreCase explicitně. Zarezervujte hodnoty pro text v přirozeném jazyce, který se uživatelům zobrazuje. Podrobné pokyny najdete v tématu Best postupy porovnání řetězců v .NET.