Verificarea pozitivă și negativă în expresiile regulate JavaScript
Uneori trebuie să rezolvi o problemă de acest tip: găsește
șirul 'aaa' și înlocuiește-l cu '!',
dar numai dacă după 'aaa' urmează
'x', iar 'x' în sine
să nu fie înlocuit. Dacă încercăm să rezolvăm problema
"direct", nu vom reuși:
'aaax baaa'.replace(/aaax/g, '!'); // returnează '! baaa', dar am vrut '!x baaa'
Verificare înainte
Pentru a rezolva problema, este nevoie de o modalitate de a spune
că 'x' nu trebuie înlocuit. Acest lucru se face
cu ajutorul unor paranteze speciale (?= ),
care doar verifică, dar nu consumă caractere.
Aceste paranteze se numesc verificare pozitivă înainte. Pozitivă - deoarece 'x'
(în cazul nostru) trebuie să fie prezent - doar atunci
va avea loc înlocuirea.
Să aplicăm aceste paranteze pentru a ne rezolva problema:
'aaax aaab'.replace(/aaa(?=x)/g, '!'); // returnează '!x aaab'
Există și verificare negativă înainte
- (?! ) - acesta, dimpotrivă, spune că
ceva nu trebuie să fie prezent. În următorul exemplu,
înlocuirea va avea loc doar dacă după 'aaa'
NU urmează 'x':
'aaax aaab'.replace(/aaa(?!x)/g, '!'); // returnează 'aaax !b'
Verificare înapoi
În mod analog, există verificare pozitivă înapoi
- (?<= ). În următorul
exemplu înlocuirea va avea loc doar dacă înaintea
'aaa' se află 'x':
'xaaa'.replace(/(?<=x)aaa/g, '!'); // returnează 'x!'
Și există de asemenea verificare negativă înapoi
- (?<! ). În următorul exemplu înlocuirea
va avea loc doar dacă înaintea 'aaa'
nu se află 'x':
'baaa'.replace(/(?<!x)aaa/g, '!'); // returnează 'b!'
Probleme practice
Este dat un șir care conține nume de funcții:
let str = 'func1() func2() func3()';
Obțineți un array cu numele funcțiilor din șir.
Este dat un șir cu un tag:
let str = '<a href="" class="eee" id="zzz">';
Obțineți un array cu numele atributelor acestui tag.
Este dat un șir cu variabile:
let str = '$aaa $bbb $ccc xxxx';
Obțineți subșirurile înaintea cărora se află simbolul dolar.