⊗jsSpRELAB 133 of 294 menu

Pozitív és negatív előre- és visszanézés a JavaScript reguláris kifejezéseiben

Időnként a következő típusú feladatot kell megoldanunk: találjuk meg a 'aaa' sztringet és cseréljük ki '!'-ra, de csak akkor, ha a 'aaa' után 'x' áll, magát a 'x'-et pedig ne cseréljük ki. Ha a feladatot 'közvetlenül' próbáljuk megoldani, akkor nem fog sikerülni:

'aaax baaa'.replace(/aaax/g, '!'); // '! baaa'-t ad vissza, de mi '!x baaa'-t szerettünk volna

Előrenézés

A feladat megoldásához szükségünk van egy módszerre, amivel kijelenthetjük, hogy a 'x'-et nem szabad kicserélni. Ez a speciális zárójelekkel (?= ) lehetséges, amelyek csak "odanéznek", de nem "viszik magukkal" a tartalmat.

Ezeket a zárójeleket pozitív előrenézésnek nevezzük. Pozitív - mert a 'x'-nek (a mi esetünkben) jelen kell lennie - csak akkor történik meg a csere.

Alkalmazzuk ezeket a zárójeleket a feladatunk megoldására:

'aaax aaab'.replace(/aaa(?=x)/g, '!'); // '!x aaab'-t ad vissza

Létezik negatív előrenézés is - (?! ) - ez éppen ellenkezőleg azt mondja, hogy valamit nem szabad, hogy következzen. A következő példában a csere csak akkor történik meg, ha a 'aaa' után NEM 'x' áll:

'aaax aaab'.replace(/aaa(?!x)/g, '!'); // 'aaax !b'-t ad vissza

Visszanézés

Hasonló módon létezik pozitív visszanézés - (?<= ). A következő példában a csere csak akkor történik meg, ha a 'aaa' elött 'x' áll:

'xaaa'.replace(/(?<=x)aaa/g, '!'); // 'x!'-t ad vissza

És létezik negatív visszanézés is - (?<! ). A következő példában a csere csak akkor történik meg, ha a 'aaa' elött NEM 'x' áll:

'baaa'.replace(/(?<!x)aaa/g, '!'); // 'b!'-t ad vissza

Gyakorlati feladatok

Adott egy függvényneveket tartalmazó sztring:

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

Kapjuk meg a függvénynevek tömbjét a sztringből.

Adott egy sztring egy taggel:

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

Kapjuk meg a tag attribútumainak neveit tartalmazó tömböt.

Adott egy sztring változókkal:

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

Kapjuk meg azon részsztringeket, amelyek előtt dollárjel áll.

byhiittrkk