Limitare la golosità nelle espressioni regolari in JavaScript
Le espressioni regolari sono per impostazione predefinita golose. Ciò significa che catturano il numero massimo possibile di caratteri. Analizziamo con un esempio. Supponiamo di avere questa stringa:
let str = 'aeeex zzz x kkk';
Supponiamo di voler trovare in questa stringa la sottostringa
'aeeex' utilizzando il seguente modello: lettera
'a', poi qualsiasi carattere una o più
volte, poi la lettera 'x'.
let res = str.replace(/a.+x/g, '!');
Ci aspettiamo che il risultato nella variabile
sia la stringa '! zzz x kkk'. Tuttavia,
non è così - nella variabile otteniamo la stringa
'! kkk'.
Il punto è che la nostra regex cerca tutti
i caratteri dalla lettera 'a' alla lettera 'x'.
Ma nella nostra stringa ci sono due lettere 'x'! A causa della
golosità, la regex cerca fino
all'ultima 'x', catturando così
non ciò che ci aspettavamo.
Certo, spesso è proprio questo comportamento che ci serve. Ma in questo caso specifico vorremmo disabilitare la golosità e dire alla regex di cercare solo fino alla prima 'x'.
Per limitare la golosità, è necessario mettere un punto interrogativo dopo l'operatore di ripetizione:
let res = str.replace(/a.+?x/g, '!');
La golosità può essere limitata per tutti gli operatori
di ripetizione: sia *, che ?, che {}
- in questo modo: *?, ?? e {}?.
Data la stringa:
let str = 'aba accca azzza wwwwa';
Scrivi un'espressione regolare che trovi tutte le stringhe
ai cui estremi ci sono le lettere 'a',
e sostituisca ciascuna di esse con '!'. Tra
le lettere 'a' può esserci qualsiasi carattere (tranne
'a').