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.