Regulární výrazy jsou vzory, které poskytují mocný způsob, jak hledat a nahrazovat části textu.
V JavaScriptu jsou k dispozici pomocí objektu RegExp a jsou také integrovány do metod řetězců.
Regulární výrazy
Regulární výraz (RV, „regular expression“, „regexp“ nebo jen „reg“) se skládá z vzoru a nepovinných příznaků (neboli vlajek).
K vytvoření objektu regulárního výrazu můžeme použít dvě syntaxe.
„Dlouhá“ syntaxe:
rv = new RegExp("vzor", "příznaky");
A „krátká“ syntaxe pomocí lomítek "/":
rv = /vzor/; // bez příznaků
rv = /vzor/gmi; // s příznaky g, m, i (budou vysvětleny dále)
Lomítka /.../ říkají JavaScriptu, že vytváříme regulární výraz. Hrají stejnou roli jako uvozovky u řetězců.
V obou případech se rv stane instancí zabudované třídy RegExp.
Hlavní rozdíl mezi těmito dvěma syntaxemi spočívá v tom, že vzor uvnitř lomítek /.../ neumožňuje vkládání výrazů (jako šablonové literály řetězců v ${...}). Je zcela statický.
Lomítka používáme tehdy, když známe regulární výraz již při psaní kódu – a to je nejběžnější situace. Naproti tomu new RegExp se častěji používá, když potřebujeme vytvořit regulární výraz „za běhu“ z dynamicky generovaného řetězce. Příklad:
let značka = prompt("Kterou značku chcete najít?", "h2");
let rv = new RegExp(`<${značka}>`); // totéž jako /<h2>/, pokud odpověď na tuto otázku byla "h2"
Příznaky
Regulární výrazy mohou obsahovat příznaky, které ovlivňují hledání.
V JavaScriptu je jich pouze 6:
i- S tímto příznakem se při hledání nerozlišují malá a velká písmena: není rozdíl mezi
Aaa(viz příklad níže). g- S tímto příznakem se najdou všechny shody, bez něj bude vrácena jenom první shoda.
m- Víceřádkový režim (bude vysvětlen v kapitole Víceřádkový režim kotev ^ $, příznak „m“).
s- Umožňuje „všetečkový“ („dotall“) režim, v němž tečce
.může odpovídat znak nového řádku\n(bude vysvětlen v kapitole Znakové třídy). u- Umožňuje plnou podporu Unicode. Tento příznak umožňuje správné zpracování zástupných párů. Více se o tom dozvíte v kapitole Unicode: příznak „u“ a třída \p{...}.
y- „Lepkavý“ („sticky“) režim: hledání na přesně dané pozici v textu (bude vysvětlen v kapitole Lepkavý příznak „y“, hledání na stanovené pozici).
Dále budeme používat následující barevné schéma:
- regulární výraz –
červený - řetězec (v němž hledáme) –
modrý - výsledek –
zelený
Hledání: řetězec.match
Jak jsme již zmínili, regulární výrazy jsou integrovány s řetězcovými metodami.
Metoda řetězec.match(rv) nalezne v řetězci řetězec všechny shody s rv.
Má tři režimy práce:
-
Pokud regulární výraz má příznak
g, vrátí pole se všemi shodami:let řetězec = "Prší, prší, jen se leje"; alert( řetězec.match(/prší/gi) ); // Prší,prší (pole 2 podřetězců, které se shodují)Prosíme všimněte si, že jsou nalezeny
Pršíiprší, protože příznakizpůsobí, že regulární výraz nerozlišuje malá a velká písmena. -
Pokud tento příznak není nastaven, vrátí se jen první shoda ve formě pole, které obsahuje celou shodu na indexu
0a některé další podrobnosti ve svých vlastnostech:let řetězec = "Prší, prší, jen se leje"; let výsledek = řetězec.match(/prší/i); // bez příznaku g alert( výsledek[0] ); // Prší (1. shoda) alert( výsledek.length ); // 1 // Podrobnosti: alert( výsledek.index ); // 0 (pozice shody) alert( výsledek.input ); // Prší, prší, jen se leje (zdrojový řetězec)Pokud je část regulárního výrazu uzavřena do závorek, může pole obsahovat i jiné indexy než
0. Probereme to v kapitole Zachytávací skupiny. -
A konečně, jestliže nebyla nalezena žádná shoda, vrátí se
null(nezáleží na tom, zda je nastaven příznakg).To je velmi důležitý detail. Pokud nejsou nalezeny žádné shody, neobdržíme prázdné pole, ale obdržíme
null. Když na to zapomeneme, můžeme dělat chyby, například:let shody = "JavaScript".match(/HTML/); // = null if (!shody.length) { // Error: Cannot read property 'length' of null alert("Chyba na výše uvedeném řádku"); }Kdybychom chtěli, aby výsledkem bylo vždy pole, můžeme to zapsat následovně:
let shody = "JavaScript".match(/HTML/) || []; if (!shody.length) { alert("Žádná shoda"); // teď to funguje }
Nahrazování: řetězec.replace
Metoda řetězec.replace(rv, náhrada) nahradí v řetězci řetězec shody nalezené regulárním výrazem rv za řetězec náhrada (pokud je uveden příznak g, nahradí všechny shody, jinak pouze první).
Příklad:
// bez příznaku g
alert( "Prší, prší".replace(/prší/i, "sněží") ); // sněží, prší
// s příznakem g
alert( "Prší, prší".replace(/prší/ig, "sněží") ); // sněží, sněží
Druhým argumentem je řetězec náhrada. V něm můžeme použít kombinace speciálních znaků, abychom vložili části shody:
| Symboly | Akce v nahrazovacím řetězci |
|---|---|
$& |
vloží celou shodu |
$` |
vloží část řetězce před shodou |
$' |
vloží část řetězce za shodou |
$n |
pokud n je 1-2ciferné číslo, vloží obsah n-tých závorek, podrobněji o tom v kapitole Zachytávací skupiny |
$<jméno> |
vloží obsah závorek se jménem jméno, podrobněji o tom v kapitole Zachytávací skupiny |
$$ |
vloží znak $ |
Příklad s $&:
alert( "Mám rád HTML".replace(/HTML/, "$& a JavaScript") ); // Mám rád HTML a JavaScript
Testování: rv.test
Metoda rv.test(řetězec) hledá alespoň jednu shodu. Pokud ji najde, vrátí true, jinak vrátí false.
let řetězec = "Mám rád JavaScript";
let rv = /RÁD/i;
alert( rv.test(řetězec) ); // true
Později v této kapitole prostudujeme další regulární výrazy, projdeme další příklady a setkáme se i s dalšími metodami.
Všechny informace o metodách uvádíme v článku Metody tříd RegExp a String.
Shrnutí
- Regulární výraz se skládá ze vzoru a nepovinných příznaků:
g,i,m,u,s,y. - Bez příznaků a speciálních symbolů (které prostudujeme později) je hledání podle RV stejné jako hledání podřetězce.
- Metoda
řetězec.match(rv)hledá shody: pokud je nastaven příznakg, najde všechny, jinak najde pouze první. - Metoda
řetězec.replace(rv, náhrada)nahradí shody nalezené podlervřetězcemnáhrada: pokud je nastaven příznakg, nahradí všechny, jinak nahradí pouze první. - Metoda
rv.test(řetězec)vrátítrue, pokud je nalezena aspoň jedna shoda, jinak vrátífalse.
Komentáře
<code>, pro několik řádků je obalte značkou<pre>, pro více než 10 řádků vložte odkaz na pískoviště (plnkr, jsbin, codepen…)