Gruppi di cattura
Impara i gruppi di cattura nelle espressioni regolari JavaScript: gruppi numerati, gruppi denominati (?<name>), gruppi non-catturanti (?:) e come usarli con match, matchAll e replace ($1, $<name>).
Un gruppo di cattura è una parte di un'espressione regolare racchiusa tra parentesi (...). Svolge due funzioni: raggruppa una porzione del pattern in modo che i quantificatori e l'alternazione si applichino all'intera sequenza, e memorizza il testo corrispondente affinché possa essere riletto in seguito.
È questo che trasforma un'espressione regolare da un semplice test sì/no in uno strumento di estrazione dati. Invece di sapere solo che una data è stata trovata, puoi estrarre l'anno, il mese e il giorno come pezzi separati. Questa pagina tratta i gruppi numerati, i gruppi denominati, i gruppi non-catturanti e il comportamento dei gruppi con match, matchAll e replace.
Comprendere i gruppi di cattura
Quando viene trovata una corrispondenza, l'intera corrispondenza viene memorizzata all'indice 0 dell'array risultante, e ogni gruppo di cattura viene memorizzato agli indici successivi (1, 2, 3, …) nell'ordine in cui compaiono le parentesi di apertura dei gruppi, da sinistra a destra.
Sintassi e utilizzo di base
Ecco un semplice esempio:
match[0] è sempre l'intera stringa corrispondente. match[1] e match[2] contengono il testo catturato dalla prima e dalla seconda coppia di parentesi. I gruppi sono numerati in base alla loro parentesi di apertura (, quindi anche i gruppi annidati hanno un ordine prevedibile (vedi sotto).
Utilizzo avanzato e tecniche
Gruppi di cattura annidati
I gruppi possono essere annidati, consentendo pattern matching più complessi. La numerazione segue ogni parentesi di apertura da sinistra a destra:
Il gruppo esterno (gruppo 1) cattura foobar, mentre i gruppi interni (2 e 3) catturano rispettivamente foo e bar. Se un gruppo è opzionale e non partecipa alla corrispondenza, il suo slot vale undefined.
Gruppi non-catturanti
A volte si vuole raggruppare parti di un pattern — per applicare un quantificatore o un'alternazione — senza occupare uno slot numerato. I gruppi non-catturanti utilizzano (?:...):
Qui foo è raggruppato ma non catturato, quindi bar diventa il gruppo 1 invece del gruppo 2. I gruppi non-catturanti mantengono l'array dei risultati ordinato e sono leggermente più veloci quando non è necessario il testo corrispondente.
Un uso comune è ripetere una sequenza senza catturare ogni ripetizione:
Esempi pratici
Analisi delle date
I gruppi di cattura possono analizzare e riformattare le date presenti nelle stringhe:
Questo codice estrae l'anno, il mese e il giorno, quindi formatta la data in uno stile diverso.
Estrazione di informazioni dagli URL
Un altro caso d'uso comune è l'estrazione di parti di un URL:
Questa espressione regolare cattura separatamente il protocollo, il dominio, il percorso e la stringa di query.
Consigli per usare efficacemente i gruppi di cattura
- Pianifica i tuoi gruppi: pensa in anticipo a quali parti del pattern devi catturare.
- Usa i gruppi non-catturanti quando necessario: usa
(?:...)per raggruppare senza catturare, in modo da semplificare l'array dei risultati. - Gruppi di cattura denominati: in JavaScript moderno (ES2018+), puoi usare gruppi di cattura denominati per una migliore leggibilità.
- Comportamento del flag globale: quando si usa il flag
gconString.prototype.match(), viene restituito un array di tutte le stringhe corrispondenti anziché i gruppi di cattura. UsaString.prototype.matchAll()per estrarre i gruppi in dettaglio con il flag globale.
Gruppi di cattura denominati
I gruppi numerati sono fragili: aggiungere un gruppo nel mezzo fa slittare ogni indice successivo. I gruppi di cattura denominati (ES2018+) evitano questo problema etichettando ogni gruppo con (?<name>...). Le catture compaiono su un object groups invece di (o in aggiunta a) indici numerici:
Preferisci i gruppi di cattura denominati per qualsiasi pattern non banale — rendono sia la regex che il codice che la legge auto-documentanti.
Utilizzo dei gruppi con match, matchAll e replace
Il modo in cui si leggono i gruppi catturati dipende dal metodo che si chiama.
Senza il flag g — match restituisce i gruppi
Un String.prototype.match() non globale restituisce un singolo array di corrispondenza con tutti i gruppi, esattamente come negli esempi precedenti. È il modo più comune per estrarre un singolo record.
Con il flag g — usa matchAll per i gruppi
Quando si aggiunge il flag globale g, match() restituisce solo un array piatto di stringhe corrispondenti complete — i gruppi vengono persi. Per ottenere i gruppi per ogni corrispondenza, usa String.prototype.matchAll(), che restituisce un iteratore di array di corrispondenze (ciascuno con il proprio object groups):
Riferirsi ai gruppi in replace
In una stringa di sostituzione di String.prototype.replace() puoi fare riferimento alle catture per numero con $1, $2, … o per nome con $<name>:
Per un maggiore controllo, passa una funzione a replace. I suoi argomenti sono la corrispondenza completa, poi ogni gruppo catturato, e (se sono stati usati nomi) un object groups finale:
Backreference
Una volta che un gruppo ha catturato del testo, puoi cercare nuovamente quel testo nel medesimo pattern usando una backreference — \\1 per i gruppi numerati o \\k<name> per quelli denominati. È utile per trovare parole ripetute o per abbinare virgolette accoppiate:
Le backreference sono un argomento a sé stante — consulta Backreference nel pattern per tutti i dettagli.
Argomenti correlati
- Alternazione (OR)
|— i gruppi sono essenziali per delimitare l'alternazione. - Quantificatori
+ * ? {n}— applica la ripetizione a un intero gruppo. - Quantificatori greedy e lazy — controlla quanto consuma un gruppo.
- Backreference
\1e\k<name>— riutilizza il testo catturato all'interno di un pattern. - Pattern e flag — il flag
g,ie gli altri flag che influenzano il matching.
Conclusione
I gruppi di cattura nelle espressioni regolari JavaScript offrono un modo robusto per lavorare con pattern di stringhe complessi. Padroneggiandone l'uso, puoi eseguire manipolazioni di testo sofisticate, estrarre dati significativi e gestire le sostituzioni con facilità. Che tu stia analizzando date, elaborando URL o riformattando stringhe, i gruppi di cattura forniscono la flessibilità e la potenza necessarie per attività avanzate di elaborazione del testo. Esplora questi esempi, esercitati con i tuoi pattern e migliora le tue competenze JavaScript per affrontare qualsiasi sfida di manipolazione delle stringhe.