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:

javascript'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:

javascript'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':

javascript'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':

javascript'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':

javascript'baaa'.replace(/(?<!x)aaa/g, '!'); // grąžins 'b!'

Praktiniai uždaviniai

Задание 1

Duota eilutė, kurioje yra funkcijų pavadinimai:

javascriptlet str = 'func1() func2() func3()';

Gaukite funkcijų pavadinimų masyvą iš eilutės.

Задание 2

Duota eilutė su tagu:

javascriptlet str = '<a href="" class="eee" id="zzz">';

Gaukite šio tago atributų pavadinimų masyvą.

Задание 3

Duota eilutė su kintamaisiais:

javascriptlet str = '$aaa $bbb $ccc xxxx';

Gaukite poeilutes, prieš kurias yra dolerio ženklas.