TOC

This article has been localized into Czech by the community.

Regulární výrazy:

Používání zachycovacích skupin

Doposud jsme používali regulární výrazy buď pro kontrolu výskytu vyhledávacího vzoru, nebo pro extrakci celého řetězce na základě tohoto vyhledávacího vzoru. Někdy však potřebujete extrahovat pouze část vyhledávacího vzoru a někdy potřebujete extrahovat více než jednu část. Pro tyto účely máme něco opravdu chytrého nazývaného zachycovací skupiny.

Tato technika funguje tak, že v rámci regulárního výrazu definujete zachycovací skupiny. Skupinu lze definovat umístěním části vzoru do závorek, například takto:

[^@]+@(.+)

Tímto způsobem zachytíte část domény (vše po znaku @) v e-mailové adrese do samostatné skupiny a JavaScriptový interpret zajistí, že tato skupina bude k dispozici, když provádíme porovnání. Dovolte mi ukázat vám příklad jeho použití:

let testString = "john.doe@gmail.com";
let regex = new RegExp("[^@]+@(.+)");
let result = testString.match(regex);
alert("Mail: " + result[0]);
alert("Domain: " + result[1]);
Mail: john.doe@gmail.com
Domain: gmail.com

Je zde potřeba trochu vysvětlení. Především regulární výraz, který používám, je extrémě základní vzor pro vyhledávání e-mailů - v žádném případě by neměl být používán v reálném kódu, protože je příliš jednoduchý. Jeho jedinou kvalitou je, že je krátký a pomůže ilustrovat tento příklad stejně jako ten další.

Všimněte si, že používám funkci match() na objektu String. Jak jsme diskutovali v předchozím článku, funkce vrátí pole nalezených shod. Nyní věnujte zvláštní pozornost poslední části regulárního výrazu: (.+)

Operátor tečka bude odpovídat čemukoli, a umístil jsem ji do závorek, aby byla definována zachycovací skupina. Díky tomu mohu přistupovat k této konkrétní části shody ve výsledku. Nyní první místo v poli (0) je vždy celá shoda, zatímco následující položky jsou hodnoty nalezené pro zachycovací skupinu(y). Takto mohu ve skutečnosti extrahovat část domény e-mailové adresy.

S tímto na paměti můžeme samozřejmě zachytit obě části e-mailové adresy - jednoduše proměníme první část také na zachycovací skupinu tím, že ji obklopíme závorkami:

let testString = "john.doe@gmail.com";
let regex = new RegExp("([^@]+)@(.+)");
let result = testString.match(regex);
alert("Mail: " + result[0]);
alert("User: " + result[1]);
alert("Domain: " + result[2]);
Mail: john.doe@gmail.com
User: john.doe
Domain: gmail.com

Všimněte si, jak snadno můžeme nyní získat konkrétní části, které chceme pomocí zachycovacích skupin, zatímco stále máme také přístup k celému odpovídajícímu řetězci.

Pojmenované skupiny

Pokud máme pouze několik zachycovacích skupin, není těžké si je zapamatovat, na kterém indexu lze jejich výsledky nalézt v rámci výsledného pole, ale někdy můžete mít mnoho zachycovacích skupin uvnitř mnohem složitějšího regulárního výrazu. V takovém případě by bylo mnohem snazší mít pro každou skupinu štítek/název. To také značně usnadní pochopení účelu regulárního výrazu, když se k němu později vrátíte.

Naštěstí pro nás regulární výrazy podporují pojmenované zachycovací skupiny a na ty lze také přistupovat z JavaScriptu. Pro definování názvu zachycovací skupiny jednoduše přidejte název do zachycovací skupiny pomocí speciální syntaxe, takto:

(?<domain>.+)

Jak vidíte, pojmenovanou zachycovací skupinu vytvoříte tak, že začáteční závorkou následuje otazník a poté název uvnitř sady špičatých závorek. Pojďme tedy přepsat náš příklad výše tak, abychom využili tuto techniku:

let testString = "john.doe@gmail.com";
let regex = new RegExp("(?<user>[^@]+)@(?<domain>.+)");
let result = testString.match(regex);
alert("Mail: " + result[0]);
alert("User: " + result.groups.user);
alert("Domain: " + result.groups.domain);
Mail: john.doe@gmail.com
User: john.doe
Domain: gmail.com

Všimněte si, jak nyní můžeme přistupovat k hodnotě každé zachycovací skupiny pomocí speciální vlastnosti groups výsledku podle jména, které jsme jim dali. Je to mnohem jednodušší, zejména když se váš regulární výraz stává složitějším.

Shrnutí

Zachycovací skupiny jsou velmi mocnou součástí regulárních výrazů, umožňující vám extrahovat více částí řetězce na základě vašeho vzoru. Přidáním jmen k vašim zachycovacím skupinám můžete svůj regulární výraz udělat čitelnějším a snadněji pochopitelným při příští návštěvě vašeho kódu.

Zachycovací skupiny lze také použít při operacích hledání a nahrazování, což ukážeme v dalším článku.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!