Regex / lastIndex - Неожиданное поведение - PullRequest
5 голосов
/ 08 октября 2009

Я знаю, что есть несколько несоответствий в регулярном выражении / lastIndex, но это новое для меня!

Ожидаемое поведение : Создание нового регулярного выражения (с литералом / конструктором), очевидно, создаст новый объект RegExp с свойством lastIndex, установленным в ноль.

Фактическое поведение : (в FF, Chrome): свойство lastIndex, похоже, сохраняется в течение нескольких созданий RegExp.

1017 * Е.Г. *

function foo(s) {

    // A *NEW* regular expression
    // is created on each call of foo():
    var regex = /ABC/g;

    document.write( regex.lastIndex + '<br/>' );

    // regex.test() updates lastIndex property
    regex.test(s);

    // This is where the regex's life should end...
    // (Why does it persist?)

}

foo('ABC');
foo('ABCABC');
foo('ABCABCABC');

Смотрите здесь: http://jsbin.com/otoze


Новый объект RegExp создается при каждом вызове функции (верно?), Так почему в документ записывается следующее? -

0
3
6

???

Обратите внимание, что эта странность, кажется, происходит в FF (3) и Chrome (2), но, как ни странно, не в IE.

Это ожидаемое поведение, IE понимает это неправильно или правильно? Это известная ошибка?


РЕДАКТИРОВАТЬ: это не происходит при создании экземпляра регулярного выражения с конструктором вместо литерала. Например. new RegExp('ABC','g'); ... Тем не менее, литерал должен (теоретически) работать, верно?

Ответы [ 2 ]

5 голосов
/ 08 октября 2009

var regex = new RegExp("ABC", "g"); не имеет этой проблемы, поэтому я думаю, /ABC/g повторно использует объекты регулярных выражений.

РЕДАКТИРОВАТЬ: Очевидно, это правильное поведение в соответствии со спецификацией ECMAScript 3.0, оно исправлено в ECMAScript 3.1 - детали

1 голос
/ 08 октября 2009

Попробуйте это:

function foo(s) {

    // A *NEW* regular expression
    // is created on each call of foo():
    var regex = new RegEx("ABC", "g");

    document.write( regex.lastIndex + '<br/>' );

    // regex.test() updates lastIndex property
    regex.test(s);

    // This is where the regex's life should end...
    // (Why does it persist?)

}

foo('ABC');
foo('ABCABC');
foo('ABCABCABC');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...