TOC

This article has been localized into Czech by the community.

Regulární výrazy:

Vyhledávání/shoda s regulárními výrazy

V tomto bodě tutoriálu jsme mluvili o tom, co jsou regulární výrazy, jak se mohou chovat odlišně na základě možností (příznaků), které specifikujete, a dokonce jsme viděli pár základních příkladů, jak lze regulární výrazy použít k hledání shody v řetězci.

Ale stále jsme neviděli plný potenciál regulárních výrazů v JavaScriptu. Jak jsem již dříve zmínil, jsou velmi dobře integrovány do jazyka JavaScript, jak uvidíme v tomto článku. Podíváme se na metody nalezené na objektu RegExp, ale také budeme mluvit o metodách nalezených na objektu String, které se přímo týkají regulárních výrazů.

RegExp.test()

Tuto metodu jsme již viděli v akci v úvodním článku, ale abychom byli důkladní, dovolte mi ji zmínit znovu. Metoda test() jednoduše zkontroluje, zda lze na řetězci pomocí daného regulárního výrazu nalézt shodu, například takto:

let testString = "Hello, I'm 42 years old";
let regex = new RegExp("[0-9]+");
if(regex.test(testString))
	alert("String contains a number!");
else
	alert("String does NOT contain a number!");

Pokud dáváte přednost doslovné notaci, výše uvedený příklad by mohl vypadat takto:

let testString = "Hello, I'm 42 years old";
if(/[0-9]+/.test(testString))
	alert("String contains a number!");
else
	alert("String does NOT contain a number!");

Metoda test() je poměrně jednoduchá, ale ve spoustě situací velmi užitečná.

RegExp.exec()

Zde to začíná být zajímavější. Můžete použít metodu exec(), abyste našli jednu nebo několik shod v řetězci. Ale nejprve se podívejme, co se stane, pokud shodu nelze najít:

let testString = "Hello, I'm forty-two years old";
let regex = new RegExp("[0-9]+");
let result = regex.exec(testString);
alert("Result: " + result);

Jednoduše dostaneme zpět NULL. Zkuste příklad, kde skutečně můžeme získat shodu:

let testString = "Hello, I'm 42 years old";
let regex = new RegExp("[0-9]+");
let result = regex.exec(testString);
alert("Result: " + result);
Result: 42

Nyní dostáváme očekávanou shodu, jak můžeme vidět z výsledku. Pokud se ale podíváme blíže, všimneme si, že výsledek metody je ve skutečnosti objekt s nalezenými řetězci, stejně jako některé další vlastnosti o tom, kde byly shody nalezeny. Zde je příklad:

let testString = "Hello, I'm 42 years old";
let regex = new RegExp("[0-9]+");
let result = regex.exec(testString);
if(result != null)
	alert("Age: " + result + " (found at position " + result.index + ")");
Age: 42 (found at position 11)

Doposud jsme našli pouze jednu shodu, ale samozřejmě by jich mohlo být více. Metoda exec() vrátí pouze první shodu, ale po tomto provedení aktualizuje vlastnost lastIndex objektu RegExp a použije ji jako výchozí pozici při dalším spuštění. Můžeme toho využít ve svůj prospěch a vložit to do smyčky, abychom extrahovali všechny shody v řetězci, takto:

let testString = "I'm 42, you're 24 and my dog is 7 years old";
let regex = new RegExp("[0-9]+", "g");
let result;
while(result = regex.exec(testString))
{
	alert("Match: " + result + " (position: " + result.index + ")");
}
Match: 42 (position: 4)
Match: 24 (position: 15)
Match: 7 (position: 32)

Velmi důležitý je příznak g (globální), který jsem nastavil na objektu RegExp - toto potřebujete, abyste s metodou exec() získali více shod.

str.search()

Pokud se posuneme k funkcím souvisejícím s regulárními výrazy nalezenými na objektu String, najdeme funkci search(), jako jednu z nejzákladnějších. Jednoduše vrátí pozici první shody, pokud existuje, nebo -1, pokud není nalezena žádná shoda:

let testString = "I'm 42, you're 24 and my dog is 7 years old";
alert("First position: " + testString.search(/[0-9]/));
alert("First position: " + testString.search(/xxx/));

Všimněte si, jak nyní volám funkci search() na proměnné testString, s regulárním výrazem jako parametrem.

Protože funkce search() nalézá pouze první shodu a vrací pouze pozici a žádné další relevantní informace, není tak často používána. Místo toho byste častěji používali funkce match/matchAll() nebo funkci exec().

str.match()

Funkce match() funguje velmi podobně jako funkce exec(), ale nachází se na objektu String namísto objektu RegExp. Proto funguje opačně - voláte ji na řetězci a jako parametr dodáte použitý regulární výraz. Zde je příklad:

let testString = "I'm 42, you're 24 and my dog is 7 years old";
let regex = new RegExp("[0-9]+", "g");
let result = testString.match(regex);
alert(result);

Jak vidíte, všechny věkové údaje nalezené v řetězci jsou vráceny jako pole a nyní máte možnost iterovat tímto polem nebo jej použít jakýmkoli jiným způsobem, který by se vám mohl líbit. Jen se ujistěte, že výsledek zkontrolujete před jeho použitím jako pole, protože pokud nejsou nalezeny žádné shody, bude místo toho vráceno NULL.

Rád bych také, abyste věnovali zvláštní pozornost příznaku g (globální), který jsem nastavil na objektu RegExp - bez něj by byla vrácena pouze první shoda. Na druhou stranu, když je pro funkci match() použit příznak g, nejsou vráceny žádné zachytávající skupiny (o nichž se dozvíte více později). Pokud potřebujete použít zachytávající skupiny A provést globální shodu, musíte použít funkci exec() nebo nedávno přidanou funkci matchAll().

str.matchAll()

Důležité: Funkce matchAll() je poměrně nedávným doplňkem do jazyka JavaScript - ve skutečnosti většina moderních prohlížečů ji nezahrnovala před rokem 2019. Takže pokud chcete podporovat starší prohlížeče, musíte použít alternativní funkci (exec() nebo match()) nebo polyfill.

Funkce matchAll() umožňuje získat kompletní seznam shod, včetně zachycovacích skupin, podobně jako funkce exec(), ale bez nutnosti manuálně iterovat a volat funkci vícekrát pro získání všech shod. Vrací takzvaný iterovatelný objekt, kterým můžete procházet nebo jej převést na pole. Uvnitř něj najdete položky s informacemi o každé shodě, podobně jako u funkce exec(). Pojďme se na to podívat v praxi:

let testString = "I'm 42, you're 24 and my dog is 7 years old";
let regex = new RegExp("[0-9]+", "g");
let result = testString.matchAll(regex);
for(let match of result)
{
	alert("Age: " + match + " (found at position " + match.index + ")");
}

Opět si všimnete příznaku g (globální) u objektu RegExp, ale tentokrát není volitelný - funkci matchAll() jednoduše nemůžete použít bez něj a pokud se o to pokusíte, bude vyvolána chyba. Také si všimněte, že pokud nejsou nalezeny žádné shody, funkce matchAll() vrátí prázdný iterovatelný objekt a ne hodnotu NULL, jak jsme byli zvyklí u ostatních funkcí.

str.split()

Poslední funkcí, na kterou se podíváme, je funkce split(). Umožňuje rozdělit řetězec na části na základě regulárního výrazu. Ve skutečnosti funkce split() není zcela spojena pouze s regulárními výrazy - můžete použít jednoduchý řetězec pro definování oddělovače/separátoru, takto:

let testString = "01-02-2042";
alert(testString.split("-"));

To rozdělí řetězec na části na základě znaku pomlčky (-), což má za následek pole tří čísel nalezených v řetězci. Co ale, když řetězec nebyl tak pečlivě formátovaný? Mohlo by se stát, že uživatel mohl použít různé znaky k oddělení čísel - pro složitější situace jako je tato můžete funkci dodat regulární výraz:

let testString = "01/02-2042";
let regex = new RegExp("[-/]");
alert(testString.split(regex));

S tímto jednoduchým regulárním výrazem můžete nyní akceptovat jak pomlčky, tak lomítka jako oddělovače, a pokud je to potřeba, můžete regulární výraz snadno rozšířit, aby pokryl další případy použití.

Shrnutí

V tomto článku jsme probrali všechny metody použití regulárních výrazů ve spojení s JavaScriptem pro vyhledávání řetězců. Jak vidíte, existuje několik metod, které vám mohou pomoci v závislosti na tom, čeho potřebujete dosáhnout. V následujících několika článcích se ještě více ponoříme do všech úžasných věcí, které můžete dělat s tímto mocným nástrojem.


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!