Pokročilejší regulární výrazy v .NET

Pokud jste se někdy setkali s regulárními výrazy v souvislosti s vyhledáním a nahrazením, pak jste pravděpodobně přišli do styku i s pojmenovanými skupinami (named capturing groups). Jak už to bývá syntaxe v tomto směru není jednotná, a proto jsem si připravil pár příkladů na využití této featury v .NET.

Nahrazení *textu v hvězdičkách* za <b>textu v hvězdičkách</b>

Regex.Replace(sourceString, @"\*(?<bold>[^\*]*)\*", @"<b>${bold}</b>");

Pojmenovaná skupina začíná závorkou, otazníkem a jménem skupiny ohraničeného většítkem a menšítkem, dále pokračuje tělo skupiny — tedy regulární výraz, který bude zachycovat znaky, co ještě „patří do skupiny“ — a končí závorkou. Při nahrazování (případně jiných operacích) se lze na obsah pojmenované skupiny odvolat pomocí syntaxe ${jmenoSkupiny}.

Zkuste si představit, že všechny texty určené pro uživatele získáváte pomocí volání metody Translate(„idPrekladu“) a chcete získat všechny parametry, se kterými je tato metoda zavolána.

var matches = Regex.Matches(
     File.ReadAllText("soubor.cs"),
     @"Translate\(""(?<id>[^""]*)""\)");

foreach (Match match in matches)
{
    Console.WriteLine(match.Result("${id}"));
}

Comments 2

  1. henal wrote:

    Příklady mají jednu drobnou chybku, a to sice, že (mi) nefungují. V obou chybí zpětná lomítka, u prvního před *, u druhého před závorkami, neboli:
    @“\*(?[^\*]*)\*“
    a
    @“Translate\(„“(?[^""]*)“"\)“

    Posted 12 Říj 2010 at 18.40
  2. Steves wrote:

    Ano, díky za upozornění. Ta lomítka jsem někde po cestě poztrácel. Teď už by to mělo být správně.

    Posted 12 Říj 2010 at 20.03

Post a Comment

Your email is never published nor shared. Required fields are marked *