Je tu opět čas regulárních výrazů. 🎉 Nepamatuji si, kde jsem viděl následující objev, ale udivuje mě, že jsem po letech používání regulárních výrazů nevěděl o nezachycujících skupinách.
Pokud již víte, co jsou nezachycující skupiny v regulárních výrazech, zde je syntaxe:je to (?:)
jako v /(?:non-caputuring group)/
.
Abychom porozuměli tomu, jak fungují skupiny, které nezachycují, podívejme se na příklad zdůrazňující dobře známé skupiny pro zachycování.
// a regular expression including three capture groups
const regex = /(Jane|John|Alison)\s(.*?)\s(Smith|Smuth)/;
Regulární výraz výše definuje, že hledám velmi konkrétní kombinaci jmen. Název by měl začínat Jane
, John
nebo Alison
, končí Smith
nebo Smuth
ale mezi jméno a příjmení vložte druhé jméno.
const result = regex.exec('Jane Isabell Smith');
console.log(result[0]); // 'Jane Isabell Smith'
console.log(result[1]); // 'Jane'
console.log(result[2]); // 'Isabell'
console.log(result[3]); // 'Smith'
Spusťte exec
regulárního výrazu metoda k testování, zda řetězec odpovídá výrazu. Pokud řetězec odpovídá výrazu, vrácená hodnota je pole obsahující všechny specifické informace, jinak exec
vrátí null
.
Pole obsahuje úplný odpovídající řetězec na indexu 0
následované definovanými skupinami (1
, 2
, atd.). V tomto příkladu pole obsahuje sekvence znaků odpovídající třem definovaným zachytávacím skupinám. I když vás zajímá pouze prostřední jméno reprezentované záznamem na indexu 2
musíte pracovat s daty pro všechny skupiny.
Na tomto přístupu není nic špatného, ale pro extrakci požadovaného druhého jména si musíte zapamatovat a vrátit se k původnímu regulárnímu výrazu, protože výsledek obsahuje několik irelevantních hodnot (1
a 3
).
Ukázalo se, že můžete definovat nezachycující skupiny, které nejsou zahrnuty ve výsledku!
// a regular expression with two non-capturing groups
// and one capturing group
const regex = /(?:Jane|John|Alison)\s(.*?)\s(?:Smith|Smuth)/;
const result = regex.exec('Jane Isabell Smith');
console.log(result[0]); // 'Jane Isabell Smith'
console.log(result[1]); // 'Isabell'
const notMatchingResult = regex.exec('nope');
console.log(notMatchingResult); // null
Použijte (?:)
syntaxe, aby odpovídala nezachycujícím skupinám ve vašich řetězcích. Skupiny, které nezachytí, jsou z výsledku vyloučeny.
Při práci se složitými regulárními výrazy je tato funkce výhodná, protože zjednodušuje zpracování výsledků! 🎉
Upraveno:Jak zdůraznil Dave Newson, na cestě jsou také pojmenované skupiny zajatců! „Skupinová budoucnost“ vypadá jasně!