A kapzsiság korlátozása reguláris kifejezésekben JavaScriptben
A reguláris kifejezések alapértelmezetten kapzsiak. Ez azt jelenti, hogy a lehető legtöbb karaktert próbálják megragadni. Nézzünk egy példát. Tegyük fel, hogy van egy ilyen karakterláncunk:
let str = 'aeeex zzz x kkk';
Tegyük fel, hogy ebben a karakterláncban meg szeretnénk találni a
'aeeex' részt a következő minta alapján: az
'a' betű, majd bármilyen karakter egy vagy több
alkalommal, majd a 'x' betű.
let res = str.replace(/a.+x/g, '!');
Arra számítanánk, hogy az eredményül kapott változó a
'! zzz x kkk' karakterlánc lesz. Azonban
ez nem így van - a változóba a
'! kkk' karakterlánc kerül.
Az egész azon múlik, hogy a reguláris kifejezésünk minden
karaktert keres az 'a' betűtől az 'x' betűig.
De a karakterláncunkban két 'x' betű van! A
kapzsiság miatt a reguláris kifejezés a
legutolsó x-ig keres, ezzel olyat megragadva,
amire nem számítottunk.
Természetesen gyakran pontosan ez a viselkedés amire szükségünk van. De ebben a konkrét esetben szeretnénk megszüntetni a kapzsiságot, és azt mondani a reguláris kifejezésnek, hogy az első x-ig keressen.
A kapzsiság korlátozásához az ismétlési operátor után kell egy kérdőjelet tenni:
let res = str.replace(/a.+?x/g, '!');
A kapzsiság minden ismétlési operátornál
korlátozható: a *, a ? és a {}
- így: *?, ?? és {}?.
Adott egy karakterlánc:
let str = 'aba accca azzza wwwwa';
Írjon egy reguláris kifejezést, amely megtalálja az összes olyan részt,
amelynek szélein 'a' betűk állnak,
és mindegyiket lecseréli '!'-ra. Az
'a' betűk között bármilyen karakter állhat (kivéve
'a').