Lookahead e Lookbehind positivo e negativo nelle espressioni regolari JavaScript
A volte è necessario risolvere un problema di questo tipo: trovare
la stringa 'aaa' e sostituirla con '!',
ma solo se dopo 'aaa' c'è
'x', e 'x' stesso
non deve essere sostituito. Se proviamo a risolvere il problema
'frontalmente', non avremo successo:
'aaax baaa'.replace(/aaax/g, '!'); // restituirà '! baaa', ma volevamo '!x baaa'
Lookahead
Per risolvere il problema, serve un modo per dire
che 'x' non deve essere sostituito. Questo si fa
tramite parentesi speciali (?= ),
che controllano semplicemente, ma non consumano i caratteri.
Queste parentesi sono chiamate lookahead positivo.
Positivo perché 'x'
(nel nostro caso) deve esserci - solo allora
avverrà la sostituzione.
Applichiamo queste parentesi per risolvere il nostro problema:
'aaax aaab'.replace(/aaa(?=x)/g, '!'); // restituirà '!x aaab'
Esiste anche il lookahead negativo
- (?! ) - che, al contrario, dice che
qualcosa non deve esserci. Nel prossimo esempio,
la sostituzione avverrà solo se dopo 'aaa'
non c'è 'x':
'aaax aaab'.replace(/aaa(?!x)/g, '!'); // restituirà 'aaax !b'
Lookbehind
Allo stesso modo, esiste il lookbehind positivo
- (?<= ). Nel prossimo
esempio la sostituzione avverrà solo se prima
di 'aaa' c'è 'x':
'xaaa'.replace(/(?<=x)aaa/g, '!'); // restituirà 'x!'
Ed esiste anche il lookbehind negativo
- (?<! ). Nel prossimo esempio la sostituzione
avverrà solo se prima di 'aaa'
non c'è 'x':
'baaa'.replace(/(?<!x)aaa/g, '!'); // restituirà 'b!'
Problemi pratici
Data una stringa contenente nomi di funzioni:
let str = 'func1() func2() func3()';
Ottieni un array dei nomi delle funzioni dalla stringa.
Data una stringa con un tag:
let str = '<a href="" class="eee" id="zzz">';
Ottieni un array dei nomi degli attributi di questo tag.
Data una stringa con variabili:
let str = '$aaa $bbb $ccc xxxx';
Ottieni le sottostringhe che sono precedute dal simbolo del dollaro.