Teigiamasis ir neigiamasis peržiūrėjimas JavaScript reguliariosiose išraiškose
Kartais reikia išspręsti tokio tipo uždavinį: rasti
eilutę 'aaa' ir pakeisti ją į '!',
bet tik jei po 'aaa' yra
'x', o pats 'x' tuo pačiu
nepakeisti. Jei bandysime išspręsti uždavinį
'tiesiogiai', mums nieko nepavyks:
'aaax baaa'.replace(/aaax/g, '!'); // grąžins '! baaa', o norėjome '!x baaa'
Peržiūrėjimas į priekį
Norint išspręsti uždavinį, reikia būdo pasakyti,
kad 'x' neturėtų būti keičiamas. Tai daroma
naudojant specialiuosius skliaustus (?= ),
kurie tik žiūri, bet neima su savimi.
Šie skliaustai vadinami teigiamuoju peržiūrėjimu į priekį. Teigiamas - nes 'x'
(mūsų atveju) turi būti - tik tada
įvyks pakeitimas.
Panaudokime šiuos skliaustus mūsų uždaviniui išspręsti:
'aaax aaab'.replace(/aaa(?=x)/g, '!'); // grąžins '!x aaab'
Yra ir neigiamasis peržiūrėjimas į priekį
- (?! ) - jis, atvirkščiai, sako, kad
kažko neturėtų būti. Šiame pavyzdyje
pakeitimas įvyks tik jei po 'aaa'
yra NE 'x':
'aaax aaab'.replace(/aaa(?!x)/g, '!'); // grąžins 'aaax !b'
Peržiūrėjimas atgal
Analogiskai yra teigiamasis peržiūrėjimas atgal
- (?<= ). Šiame
pavyzdyje pakeitimas įvyks tik jei prieš
'aaa' yra 'x':
'xaaa'.replace(/(?<=x)aaa/g, '!'); // grąžins 'x!'
Taip pat yra ir neigiamasis peržiūrėjimas atgal
- (?<! ). Šiame pavyzdyje pakeitimas
įvyks tik jei prieš 'aaa'
nėra 'x':
'baaa'.replace(/(?<!x)aaa/g, '!'); // grąžins 'b!'
Praktiniai uždaviniai
Duota eilutė, kurioje yra funkcijų pavadinimai:
let str = 'func1() func2() func3()';
Gaukite funkcijų pavadinimų masyvą iš eilutės.
Duota eilutė su tagu:
let str = '<a href="" class="eee" id="zzz">';
Gaukite šio tago atributų pavadinimų masyvą.
Duota eilutė su kintamaisiais:
let str = '$aaa $bbb $ccc xxxx';
Gaukite poeilutes, prieš kurias yra dolerio ženklas.