Vyhledávací řetězce v jazyce C#

Návod

Tento článek je součástí části Základy pro vývojáře, kteří už znají aspoň jeden programovací jazyk a učí se jazyk C#. Pokud s programováním teprve začínáte, začněte nejprve kurzy Začínáme .

Pochází z jiného jazyka? Metody jazyka C# string, například Contains, StartsWith a IndexOf, jsou obdobou paralelních metod v Javě String a v JavaScriptu String.prototype. Klíčovým rozdílem je, že některá vyhledávání v jazyce C# ve výchozím nastavení používají ordinální porovnání s rozlišováním velkých a malých písmen. Ostatní ve výchozím nastavení mají sémantiku aktuální jazykové verze. V případě hledání určených pro uživatele můžete chtít předat StringComparison hodnotu.

Třída String obsahuje metody, které odpovídají na dvě každodenní otázky:

Složitější vyhledávací a náhradní algoritmy je možné sestavit pomocí regulárních výrazů. Další informace o regulárních výrazech a dalších operacích řetězců najdete v referenčním článku jazyka o operacích s řetězci.

Kontrola, jestli řetězec obsahuje text

Použijte Contains, StartsWith nebo EndsWith k otestování přítomnosti podřetězce:

string factMessage = "Extension methods have all the capabilities of regular static methods.";

// Write the string and include the quotation marks.
Console.WriteLine($"\"{factMessage}\"");

// Default comparisons are case sensitive.
bool containsSearchResult = factMessage.Contains("extension");
Console.WriteLine($"""Contains "extension"? {containsSearchResult}""");

// For user-facing searches, pass a StringComparison value to control case and culture.
bool ignoreCaseSearchResult = factMessage.StartsWith("extension", StringComparison.CurrentCultureIgnoreCase);
Console.WriteLine($"""Starts with "extension"? {ignoreCaseSearchResult} (ignoring case)""");

bool endsWithSearchResult = factMessage.EndsWith(".", StringComparison.Ordinal);
Console.WriteLine($"Ends with '.'? {endsWithSearchResult}");
// => "Extension methods have all the capabilities of regular static methods."
// => Contains "extension"? False
// => Starts with "extension"? True (ignoring case)
// => Ends with '.'? True

Tyto metody ve výchozím nastavení používají porovnání rozlišující malá a velká písmena a ordinální. Pokud chcete přijímat vstup od uživatele nebo ignorovat velikost písmen u zobrazovaného textu, předejte hodnotu StringComparison, například StringComparison.CurrentCultureIgnoreCase nebo StringComparison.OrdinalIgnoreCase.

Při hledání jednotlivého znaku použijte přetíženou verzi Contains označenou jako char. Vyhne se přidělování řetězce s jedním znakem a je přímější:

string path = "/usr/local/bin";
bool hasSlash = path.Contains('/');
Console.WriteLine($"Path contains '/': {hasSlash}");
// => Path contains '/': True

Vyhledání pozice textu

IndexOf vrátí index založený na nule prvního výskytu podřetědce (nebo znaku) a LastIndexOf vrátí index posledního výskytu. Obě se vrátí -1 , když hledaný text není k dispozici. Zkombinujte je a extrahujte text mezi dvěma značkami:

string factMessage = "Extension methods have all the capabilities of regular static methods.";

Console.WriteLine($"\"{factMessage}\"");

// Extract the text between the first and last occurrence of "methods".
int first = factMessage.IndexOf("methods") + "methods".Length;
int last = factMessage.LastIndexOf("methods");
string between = factMessage.Substring(first, last - first);
Console.WriteLine($"""Substring between "methods" and "methods": '{between}'""");
// => "Extension methods have all the capabilities of regular static methods."
// => Substring between "methods" and "methods": ' have all the capabilities of regular static '

Pokud potřebujete všechny výskyty, nikoli jen první nebo poslední, iterujte tak, že jako argument startIndex předáte předchozí výsledek plus jedna, nebo přejděte na regulární výraz.

Výběr správného porovnání

Většina přetížení vyhledávání přijímá volitelnou StringComparison hodnotu. Vyberte ho na základě typu dat, která hledáte:

  • Pokud hledáte identifikátory, cesty k souborům, tokeny protokolu nebo cokoli jiného, použijte Ordinal.
  • Pokud hledáte stejný druh strojově definovaných dat, ale chcete rozlišovat malá a velká písmena, použijte OrdinalIgnoreCase.
  • Pokud hledáte text viditelný uživatelem, kde by se měla použít aktuální pravidla národního prostředí, použijte CurrentCulture.
  • Pokud hledáte tentýž text zobrazený uživateli a chcete ignorovat rozdíly mezi velkými a malými písmeny, použijte CurrentCultureIgnoreCase.
  • Pokud prohledáváte uložená data, která se musí porovnávat stejně na každém počítači a v každém národním prostředí, použijte InvariantCulture (zřídka potřeba).

Pořadové porovnání je nejrychlejší možností a správným výchozím nastavením pro cokoli, co není text v přirozeném jazyce. Porovnávání zohledňující jazykové nastavení je výrazně pomalejší a může přinášet neočekávané výsledky. Například v některých kulturních prostředích malé písmeno i neodpovídá velkému písmenu I. Vyhraďte ho pro vyhledávání, která uživatelé provádějí v souvislém textu.

Podrobný výklad porovnávání zohledňujícího jazykové a kulturní rozdíly najdete v tématu Osvědčené postupy pro porovnávání řetězců.

Viz také