W3docs

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:

javascript— editable

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:

javascript— editable

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 (?:...):

javascript— editable

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:

javascript— editable

Esempi pratici

Analisi delle date

I gruppi di cattura possono analizzare e riformattare le date presenti nelle stringhe:

javascript— editable

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:

javascript— editable

Questa espressione regolare cattura separatamente il protocollo, il dominio, il percorso e la stringa di query.

Consigli per usare efficacemente i gruppi di cattura

  1. Pianifica i tuoi gruppi: pensa in anticipo a quali parti del pattern devi catturare.
  2. Usa i gruppi non-catturanti quando necessario: usa (?:...) per raggruppare senza catturare, in modo da semplificare l'array dei risultati.
  3. Gruppi di cattura denominati: in JavaScript moderno (ES2018+), puoi usare gruppi di cattura denominati per una migliore leggibilità.
  4. Comportamento del flag globale: quando si usa il flag g con String.prototype.match(), viene restituito un array di tutte le stringhe corrispondenti anziché i gruppi di cattura. Usa String.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:

javascript— editable
Informazione

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 gmatch 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):

javascript— editable

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>:

javascript— editable

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:

javascript— editable

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:

javascript— editable

Le backreference sono un argomento a sé stante — consulta Backreference nel pattern per tutti i dettagli.

Argomenti correlati

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.

Esercizio

Pratica
Quali delle seguenti affermazioni sui gruppi di cattura nelle espressioni regolari JavaScript sono vere?
Quali delle seguenti affermazioni sui gruppi di cattura nelle espressioni regolari JavaScript sono vere?
Was this page helpful?