Säännöllisten lausekkeiden ahneuden rajoittaminen JavaScriptissä
Säännölliset lausekkeet ovat oletusarvoisesti ahneita. Tämä tarkoittaa, että ne sieppaavat mahdollisimman paljon merkkejä. Katsotaan tätä esimerkin avulla. Oletetaan, että meillä on tällainen merkkijono:
let str = 'aeeex zzz x kkk';
Oletetaan, että haluamme löytää tästä merkkijonosta osajonon
'aeeex' seuraavan mallin mukaisesti: kirjain
'a', sitten mikä tahansa merkki yksi tai useampi
kerta, sitten kirjain 'x'.
let res = str.replace(/a.+x/g, '!');
Odotamme, että muuttujaan tuloksena
kirjoitetaan merkkijono '! zzz x kkk'. Kuitenkin,
nin ei käy - muuttujaan päätyy merkkijono
'! kkk'.
Syynä on, että säännöllisemme etsii kaikki
merkit kirjaimesta 'a' kirjaimeen 'x'.
Mutta merkkijonossamme on kaksi kirjainta 'x'! Ahneuden
takia käy niin, että säännöllinen lauseke etsii
viimeiseen x-kirjaimeen saakka, siepaten siten
muuta kuin mitä odotimme.
Tietysti usein tällainen käyttäytyminen on juuri sitä mitä tarvitsemme. Mutta tässä tapauksessa haluaisimme peruuttaa ahneuden ja käskeä säännölliselle lausekkeelle, että sen tulisi etsiä ensimmäiseen x-kirjaimeen saakka.
Ahneuden rajoittamiseksi toistooperaattorin jälkeen tulee laittaa kysymysmerkki:
let res = str.replace(/a.+?x/g, '!');
Ahneutta voidaan rajoittaa kaikille
toistooperaattoreille: sekä *, että ?, ja {}
- näin: *?, ?? ja {}?.
Annettu merkkijono:
let str = 'aba accca azzza wwwwa';
Kirjoita säännöllinen lauseke, joka löytää kaikki merkkijonot,
joiden reunoilla on kirjaimet 'a',
ja korvaa jokainen niistä merkillä '!'.
Kirjainten 'a' välissä voi olla mikä tahansa merkki (paitsi
'a').