4. Práce s řetězci

Klíčové slovo string je synonymem bázové třídy System.String. Tato třída není jedinou třídou pro práci s řetězci. Např. System.Text a System.Text.RegularExpressions. Při opakované úpravě řetězce je třída System.String velmi neefektivní. Je lepší pro takový případ použít System.Text.StringBuilder. Formátování textu při volání Console.WriteLine() lze ovlivňovat implementací rozhraní IFormatProvider a IFormattable. Pro vyhledávání a úpravu řetězců lze využít regulárních výrazů za pomocí System.Text.RegularExpressions.

4.1. Třída System.String

Třída pro ukládání řetězců, obsahuje mnoho řetězcových operací. Díky přetíženému operátoru „+“ lze řetězce spojovat. Lze za pomocí indexeru extrahovat znaky z řetězce.

Některé metody třídy System.String:

  • Compare() - porovná znak po znaku obsah řetězců, zohledňuje místní jazykové nastavení;

  • CompareOriginal() - totéž co Compare() ale nezohledňuje místní jazyková nastavení;

  • Format() - formátuje řetězec;

  • IndexOf() - najde první výskyt podřetězce nebo znaku v řetězci;

  • IndexOfAny() - najde první výskyt libovolné množiny znaků v řetězci;

  • LastIndexOf() - najde poslední výskyt podřetězce nebo znaku v řetězci;

  • LastIndexOfAny() - najde poslední výskyt libovolné množiny znaků v řetězci;

  • PadLeft() - Doplní zleva řetězec opakováním daného znaku;

  • PadRight() - Doplní zprava řetězec opakováním daného znaku;

  • Replace() - nahradí výskyty daného řetězce zadaným řetězcem nebo znakem;

  • Split() - rozdělí řetězec na podřetězce, zlomení dojde v místech nalezení zadaného znaku;

  • Substring() - vrátí podřetězec požínající zadanou pozicí v řetězci;

  • ToLower() - převede řetězec na malá písmena;

  • ToUpper() - převede řetězec na velká písmena;

  • Trim() - odstraní ze začátku a konce řetězce mezery.

Řetězec ve třídě String je neměnný. Metody manipulující s řetězcem vytvářejí vždy novou instanci. Aby nedocházelo k problémům s paměťovou náročností při úpravě řetězců, máme k dispozici třídu System.Text.StringBuilder. Třída není tak výkonná jako System.String, ale její použití při konkatenaci, náhradě, atd. řetězců je mnohem efektivnější.

4.2. Porovnávání řetězců

System.String je odkazovým typem. Lze jej však porovnat operátorem ==, neboť je přetížený.

4.3. Třída System.Text.StringBuilder

má vlastnosti Length (aktuální délka řetězce) a Capacity (objem rezervované paměti). Konstruktor očekává řetězec, kapacitu, nebo řetězec a kapacitu. Zde se při úpravě řetězce nevytváří nová instance, ale upravuje se obsah stávající. Nová paměť bude rezervována tehdy, když po vykonané operaci řetězec přesahuje kapacitu.

Některé metody třídy System.Text.StringBuilder:

  • Append() - připojí řetězec;

  • Insert() - vloží řetězec;

  • Remove() - odstraní znaky z řetězce;

  • Replace() - nahradí výskyty znaku nebo podřetězce jiným znakem nebo podřetězcem;

  • ToString() - Vrací obsah řetězce přetypovaný na System.String.

4.4. Formátovací řetězce

jsou řetězce, které jsou doplněny o další informace říkající, jak má výsledný řetězec nakonec vypadat. Používá se zejména u specifických formátů příslušejících různým místním nastavením. Například formát data a podobně. Do složených závorek se uvádí číselné hodnoty, které určují jak má být zobrazovaná informace formátována, resp. kolik znaků bude k zobrazení informace potřeba. První číslo však vždy uvádí, který z následujících argumentů bude použit při formátování. Například Console.Writeln(„a = {0,10:E}; b = {1};”, a, b); Kladné číslo zarovnává doprava, záporné číslo doleva. Za dvojtečkou je uveden typ zobrazované informace, viz tabulka několika typů:

  • C – číselný typ – lokální formát měny ($435,25)

  • D – celočíselný typ – obecný formát

  • E – číselný typ – vědecký formát s exponentem (4,85300E+003)

  • F – číselný typ – pro pevnou desetinnou čárku (458,235)

  • G – číselný typ – obecný formát (458,235)

  • N – číselný typ – odděluje tisíce na základě národního nastavení

  • P – číselný typ – formát procent

  • X – Pouze celočíselný typ – hexadecimální formát

Metoda Console.Writeln předá argumenty metodě String.Format(). Ten rozloží řetězec na několik částí a předá jej ke zpracování několika metodám.

Metoda AppendFormat musí vědět jakým způsobem má objekt formátovat. Zjistí, zda daný objekt implementuje rozhraní System.IFormattable. Pokud ne, zavolá metodu ToString(). Pokud ano zavolá dvouargumentovou metodu ToString (viz rozhrani System.IFormattable). Použití metody Writeln s jedním argumentem vytiskne řetězec bez formátování.

Rozhraní System.IFormattable předpokládá definici dvouargumentové metody ToString(string format, IFormatProvider formatProvider); Prvním argumentem je řetězec určující požadovaný formát a druhým argumentem je odkaz na objekt implementující rozhraní IFormatProvider. Toto rozhraní poskytuje další informace, jak formátovat řetězec.

4.5. Regulární výrazy

Slouží pro práci s řetězci. Na základě zadaného vzoru lze v řetězci vyhledat (a třeba následně upravit) podřetězce. Regulární výrazy v jazyce C# jsou navrženy podle Perl 5 s dalšími rozšířeními. Operace s regulárními výrazy poskytuje třída System.Text.RegularExpressions. Pro použití se vytvoří instance třídy System.Text.RegularExpressions.Regex, nebo se zavolá statická metoda RegEx, které se předá v parametru řetězec a regulární výraz. Následuje příklad použití regulárního výrazu k vyhledání textu.

[ukázka kódu]
string text = "hello world";
string pattern = "o";

MatchCollection Matches(text, pattern, RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture);

foreach (Match NextMatch in Matches)
{
  Console.WriteLine(NextMatch.Index);
}

Několik metaznaků, které může regulární výraz obsahovat:

  • ^ - počátek vstupního textu;

  • $ - konec vstupního textu;

  • . – jakýkoliv znak kromě konce řádku;

  • * - libovolný počet výskytů znaku uvedeného před hvězdičkou;

  • + - jeden nebo více výskytů znaku uvedeného před plus;

  • ? – 0 nebo 1 výskyt znaku uvedeného před hvězdičkou;

  • \s – bílý znak;

  • \S – vše kromě bílého znaku;

  • \b – hranice slova;

  • \B – jakákoli pozice, která není hranicí slova;

  • kulaté závorky – ohraničují skupiny znaků (metazaků).