W3docs

Lookahead e Lookbehind

In questo capitolo esploriamo il rilevamento delle corrispondenze in JavaScript. Impara come usare Lookahead e Lookbehind in modo pratico.

Comprendere gli argomenti avanzati delle espressioni regolari di JavaScript è utile per qualsiasi sviluppatore che desideri migliorare le proprie competenze di programmazione. Tra le funzionalità più avanzate e potenti in questo ambito vi sono le asserzioni lookahead e lookbehind. Queste asserzioni consentono agli sviluppatori di cercare pattern nel testo senza includerli nel risultato. Questa guida si propone di fornire un'esplorazione approfondita delle asserzioni lookahead e lookbehind in JavaScript, corredata da numerosi esempi pratici.

Attenzione

Le espressioni regolari possono essere complicate e possono esistere casi limite. Ciò è particolarmente vero quando si utilizzano concetti avanzati come Lookahead e Lookbehind. Usa tester di regex online o scrivi unit test per validare le tue espressioni su una varietà di scenari di input e assicurarti che si comportino come previsto.

Introduzione alle asserzioni Lookahead e Lookbehind

Le asserzioni lookahead e lookbehind sono asserzioni a larghezza zero, il che significa che corrispondono a una posizione all'interno della stringa piuttosto che a caratteri effettivi. Ci permettono di verificare se un determinato pattern esiste o non esiste in un punto specifico della stringa. Nota: i moderni motori JavaScript (ES2018+) supportano asserzioni lookbehind a lunghezza variabile, sebbene alcuni ambienti meno recenti possano richiedere pattern a lunghezza fissa.

Esistono quattro asserzioni, formate combinando la direzione (ahead/behind) con la polarità (positiva/negativa):

AsserzioneSintassiSignificato
Lookahead positivo(?=...)Il pattern deve seguire questo punto
Lookahead negativo(?!...)Il pattern non deve seguire questo punto
Lookbehind positivo(?<=...)Il pattern deve precedere questo punto
Lookbehind negativo(?<!...)Il pattern non deve precedere questo punto

Perché la "larghezza zero" è importante

Poiché le asserzioni corrispondono a una posizione e non a caratteri, il testo che verificano non viene mai incluso nella corrispondenza e la posizione di lettura del motore regex non avanza oltre di esso. Questo è esattamente ciò che le rende utili: puoi richiedere del contesto attorno a una corrispondenza senza che quel contesto faccia parte del risultato. Lo snippet seguente mostra la differenza tra un gruppo di acquisizione reale e un lookahead — entrambi verificano che pie segua apple, ma solo il gruppo consuma il testo:

javascript— editable

Se non conosci la sintassi del gruppo (...), consulta Capturing groups — la sintassi lookaround utilizza le stesse parentesi ma aggiunge ?=, ?!, ?<= o ?<! subito dopo la parentesi di apertura.

Lookahead positivo

Un'asserzione lookahead positiva verifica l'esistenza di un determinato pattern davanti alla posizione corrente nella stringa. È denotata da (?=...). Il seguente esempio usa un lookahead positivo per trovare la parola "apple" seguita dalla parola "pie":

Il lookaround regexp di Javascript corrisponde ai caratteri

javascript— editable

Lookahead negativo

Un'asserzione lookahead negativa verifica l'assenza di un determinato pattern davanti alla posizione corrente. È denotata da (?!...). Il seguente esempio usa un lookahead negativo per trovare la parola "apple" non seguita dalla parola "pie":

Il lookahead negativo di regexp in Javascript

javascript— editable

Lookbehind positivo

Un'asserzione lookbehind positiva verifica l'esistenza di un determinato pattern dietro la posizione corrente nella stringa. È denotata da (?<=...). Di seguito è riportato un esempio di codice per trovare la parola "pie" preceduta dalla parola "apple":

Il lookbehind positivo di regexp in Javascript

javascript— editable

Lookbehind negativo

Un'asserzione lookbehind negativa verifica l'assenza di un determinato pattern dietro la posizione corrente. È denotata da (?<!...). Ecco un esempio per trovare la parola "pie" che non è preceduta dalla parola "apple":

Lookahead e Lookbehind

javascript— editable

Applicazioni pratiche di Lookahead e Lookbehind

Validazione della forza delle password

Garantire password robuste è un requisito comune nelle applicazioni web. Le asserzioni lookahead possono essere utilizzate per validare varie condizioni sulle password senza consumare caratteri.


javascript— editable

Qui ogni (?=...) è un requisito separato verificato dall'inizio della stringa. Poiché ogni lookahead ha larghezza zero, tutti e quattro scansionano lo stesso testo in modo indipendente senza interferire tra loro, e il [A-Za-z\d@$!%*?&]{8,} finale è ciò che effettivamente consuma la password. Gli ancoraggi ^ e $ vincolano il controllo all'intera stringa, e {8,} è un quantificatore che richiede almeno otto caratteri.

Formattazione e parsing dei dati

Le asserzioni lookahead e lookbehind possono aiutare nella formattazione e nel parsing di strutture dati complesse. Un buon esempio è l'inserimento di virgole in una stringa di numeri per migliorarne la leggibilità:


javascript— editable

Questo funziona sostituendo ogni posizione vuota (\B, un non-confine di parola) seguita da un gruppo di tre cifre ripetuto fino alla fine del numero. Il (?!\d) finale assicura che si corrispondano solo le posizioni in cui le cifre rimanenti si dividono esattamente in gruppi di tre, in modo che nessuna virgola venga inserita all'inizio.

Estrarre l'importo da un prezzo

Il lookbehind è ideale per catturare un valore che si trova dopo un marcatore noto senza acquisire il marcatore stesso. Qui estraiamo l'importo numerico che segue il simbolo $:

javascript— editable

Il lookbehind (?<=\$) richiede un $ immediatamente prima del numero ma lo esclude dal risultato, quindi ogni corrispondenza contiene solo il valore. Confronta questo con l'uso di un gruppo di acquisizione — un gruppo ti obbligherebbe a leggere l'importo da match[1], mentre il lookbehind mette il valore direttamente nella corrispondenza.

Agire solo quando qualcosa non segue

Il lookahead negativo ti permette di agire su una posizione in base a ciò che non viene dopo. Questo esempio sostituisce hello con HI solo quando non è seguito da world:

javascript— editable

Argomenti correlati

Conclusione

Padroneggiare le asserzioni lookahead e lookbehind in JavaScript può migliorare significativamente la tua capacità di manipolare e analizzare le stringhe. Questi potenti strumenti offrono la flessibilità di verificare pattern senza consumare caratteri, rendendoli preziosi per le operazioni complesse di elaborazione del testo. Sfruttando queste asserzioni, gli sviluppatori possono creare espressioni regolari più efficienti ed efficaci, portando a un codice più pulito e manutenibile.

Esercitazione

Pratica
Quali delle seguenti affermazioni sulle asserzioni lookahead e lookbehind in JavaScript sono corrette?
Quali delle seguenti affermazioni sulle asserzioni lookahead e lookbehind in JavaScript sono corrette?
Was this page helpful?