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.
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):
| Asserzione | Sintassi | Significato |
|---|---|---|
| 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:
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
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
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
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
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.
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à:
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 $:
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:
Argomenti correlati
- Capturing groups — le parentesi su cui si basa la sintassi lookaround.
- Ancoraggi: inizio e fine della stringa —
^e$, spesso abbinati al lookahead nella validazione. - Quantificatori, +, *, ? e
{n}— controllo della ripetizione dentro e fuori dalle asserzioni. - Quantificatori greedy e lazy — come la lunghezza delle corrispondenze interagisce con il lookaround.
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.