Regulární výrazy jsou vzory, které poskytují účinný způsob vyhledávání a nahrazování v textu.
V JavaScriptu jsou dostupné prostřednictvím objektu RegExp a také jsou integrovány do metod řetězců.
Regulární výrazy
Regulární výraz (také „regexp“ nebo jen „reg“) se skládá z vzoru a volitelné příznaky .
Existují dvě syntaxe, které lze použít k vytvoření objektu regulárního výrazu.
„Dlouhá“ syntaxe:
regexp = new RegExp("pattern", "flags");
A ten „krátký“ s lomítky "/"
:
regexp = /pattern/; // no flags
regexp = /pattern/gmi; // with flags g,m and i (to be covered soon)
Lomítka /.../
sdělte JavaScriptu, že vytváříme regulární výraz. Hrají stejnou roli jako uvozovky pro řetězce.
V obou případech regexp
se stane instancí vestavěného RegExp
třída.
Hlavním rozdílem mezi těmito dvěma syntaxemi je vzor používající lomítka /.../
neumožňuje vkládání výrazů (jako literály řetězcové šablony s ${...}
). Jsou plně statické.
Lomítka se používají, když známe regulární výraz v době psaní kódu – a to je nejběžnější situace. Zatímco 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. Například:
let tag = prompt("What tag do you want to find?", "h2");
let regexp = new RegExp(`<${tag}>`); // same as /<h2>/ if answered "h2" in the prompt above
Příznaky
Regulární výrazy mohou mít příznaky, které ovlivňují vyhledávání.
V JavaScriptu jich je pouze 6:
i
- S tímto příznakem vyhledávání nerozlišuje velká a malá písmena:žádný rozdíl mezi
A
aa
(viz příklad níže). g
- S tímto příznakem vyhledá hledání všechny shody, bez něj – vrátí se pouze první shoda.
m
- Víceřádkový režim (popsaný v kapitole Víceřádkový režim kotev ^ $, příznak "m").
s
- Povoluje režim „dotall“, který umožňuje tečku
.
aby odpovídal znaku nového řádku\n
(popsané v kapitole Třídy postav). u
- Povoluje plnou podporu Unicode. Příznak umožňuje správné zpracování náhradních párů. Více o tom v kapitole Unicode:příznak "u" a třída \p{...}.
y
- Režim „Sticky“:vyhledávání na přesné pozici v textu (popsané v kapitole Příznak „y“, vyhledávání na pozici)
Odsud je barevné schéma:
- regexp –
red
- řetězec (kde hledáme) –
blue
- výsledek –
green
Vyhledávání:str.match
Jak již bylo zmíněno, regulární výrazy jsou integrovány s řetězcovými metodami.
Metoda str.match(regexp)
najde všechny shody regexp
v řetězci str
.
Má 3 pracovní režimy:
-
Pokud má regulární výraz příznak
g
, vrátí pole všech shod:let str = "We will, we will rock you"; alert( str.match(/we/gi) ); // We,we (an array of 2 substrings that match)
Upozorňujeme, že obě
We
awe
jsou nalezeny, protože příznaki
regulární výraz nerozlišuje velká a malá písmena. -
Pokud takový příznak neexistuje, vrátí pouze první shodu ve formě pole s úplnou shodou na indexu
0
a některé další podrobnosti ve vlastnostech:let str = "We will, we will rock you"; let result = str.match(/we/i); // without flag g alert( result[0] ); // We (1st match) alert( result.length ); // 1 // Details: alert( result.index ); // 0 (position of the match) alert( result.input ); // We will, we will rock you (source string)
Pole může mít jiné indexy než
0
pokud je část regulárního výrazu uzavřena v závorkách. Tomu se budeme věnovat v kapitole Zachycování skupin. -
A nakonec, pokud nejsou žádné shody,
null
je vráceno (nezáleží na tom, zda je příznakg
nebo ne).Toto je velmi důležitá nuance. Pokud neexistují žádné shody, neobdržíme prázdné pole, ale místo toho obdržíme
null
. Zapomenutí na to může vést k chybám, např.:let matches = "JavaScript".match(/HTML/); // = null if (!matches.length) { // Error: Cannot read property 'length' of null alert("Error in the line above"); }
Pokud bychom chtěli, aby výsledkem bylo vždy pole, můžeme to zapsat takto:
let matches = "JavaScript".match(/HTML/) || []; if (!matches.length) { alert("No matches"); // now it works }
Nahrazení:str.replace
Metoda str.replace(regexp, replacement)
nahradí shody nalezené pomocí regexp
v řetězci str
s replacement
(vše odpovídá, pokud je příznak g
, jinak pouze první).
Například:
// no flag g
alert( "We will, we will".replace(/we/i, "I") ); // I will, we will
// with flag g
alert( "We will, we will".replace(/we/ig, "I") ); // I will, I will
Druhý argument je replacement
tětiva. Můžeme v něm použít speciální kombinace znaků pro vložení fragmentů shody:
Symboly | Akce v náhradním řetězci |
---|---|
$& | vloží celou shodu |
$` | vloží část řetězce před shodu |
$' | vloží část řetězce za shodu |
$n | if n je 1-2 místné číslo, pak vloží obsah n-tých závorek, více o tom v kapitole Zachycení skupin |
$<name> | vloží obsah závorek s daným name , více o tom v kapitole Zachycování skupin |
$$ | vloží znak $ |
Příklad s $&
:
alert( "I love HTML".replace(/HTML/, "$& and JavaScript") ); // I love HTML and JavaScript
Testování:regexp.test
Metoda regexp.test(str)
hledá alespoň jednu shodu, pokud je nalezena, vrátí true
, jinak false
.
let str = "I love JavaScript";
let regexp = /LOVE/i;
alert( regexp.test(str) ); // true
Později v této kapitole prostudujeme více regulárních výrazů, projdeme si další příklady a také se setkáme s dalšími metodami.
Úplné informace o metodách jsou uvedeny v článku Methods of RegExp and String.
Shrnutí
- Regulní výraz se skládá ze vzoru a volitelných příznaků:
g
,i
,m
,u
,s
,y
. - Bez příznaků a speciálních symbolů (které si prostudujeme později) je vyhledávání podle regulárního výrazu stejné jako vyhledávání podřetězců.
- Metoda
str.match(regexp)
hledá shody:všechny, pokud existujeg
vlajka, jinak pouze první. - Metoda
str.replace(regexp, replacement)
nahradí shody nalezené pomocíregexp
sreplacement
:všechny, pokud existujeg
vlajka, jinak pouze první. - Metoda
regexp.test(str)
vrátítrue
pokud existuje alespoň jedna shoda, jinak vrátífalse
.