Какво прави regex' флагът 'y'?

MDN казва:

За да извършите „залепващо“ търсене, което съвпада, започвайки от текущата позиция в целевия низ, използвайте флага y.

Не го разбирам съвсем.


person DarkLightA    schedule 27.12.2010    source източник


Отговори (1)


Обектите с регулярен израз имат свойство lastIndex, което се използва по различни начини в зависимост от g (глобален) и y (залепващи) флагове. Флагът y (лепкав) указва на регулярния израз да търси съвпадение при lastIndex и само при lastIndex (не по-рано или по-късно в низа).

Примерите струват 1024 думи:

var str =  "a0bc1";
// Indexes: 01234

var rexWithout = /\d/;
var rexWith    = /\d/y;

// Without:
rexWithout.lastIndex = 2;          // (This is a no-op, because the regex
                                   // doesn't have either g or y.)
console.log(rexWithout.exec(str)); // ["0"], found at index 1, because without
                                   // the g or y flag, the search is always from
                                   // index 0

// With, unsuccessful:
rexWith.lastIndex = 2;             // Says to *only* match at index 2.
console.log(rexWith.exec(str));    // => null, there's no match at index 2,
                                   // only earlier (index 1) or later (index 4)

// With, successful:
rexWith.lastIndex = 1;             // Says to *only* match at index 1.
console.log(rexWith.exec(str));    // => ["0"], there was a match at index 1.

// With, successful again:
rexWith.lastIndex = 4;             // Says to *only* match at index 4.
console.log(rexWith.exec(str));    // => ["1"], there was a match at index 4.
.as-console-wrapper {
  max-height: 100% !important;
}


Бележка за съвместимост:

JavaScript машината SpiderMonkey на Firefox има флага y от години, но той не беше част от спецификацията до ES2015 (юни 2015 г.). Освен това за известно време Firefox имаше бъг при обработката на флага y по отношение на твърдението ^, но то беше коригирано някъде между Firefox 43 (има грешката) и Firefox 47 (няма). Много стари версии на Firefox (да речем 3.6) имаха y и нямаха грешката, така че това беше регресия, която се случи по-късно (недефинирано поведение за флага y), и след това беше коригирана.

person T.J. Crowder    schedule 27.12.2010