2009-10-07 3 views
5

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

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

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

E.g.

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 неправильным или правильным? Это известная ошибка?


EDIT: это, похоже, не возникает при создании экземпляра регулярного выражения с помощью конструктора вместо литерала. Например. new RegExp('ABC','g'); ... Тем не менее, литерал должен (теоретически) работать, не так ли?

ответ

5

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

EDIT: Видимо, это правильное поведение в соответствии с ECMAScript 3.0 спецификации, это фиксируется в ECMAScript 3.1 - details

+0

Это мое предположение слишком ... Еще странно ... – James

+0

@JP: На самом деле это не так странно, вы никогда не использовали ключевое слово 'new'. – Chris

+0

Странно, что если вы вызовете один и тот же код в функции несколько раз, он вернет правильный вывод. Похоже, что он некорректно оптимизирует некоторые назначения при последующих вызовах одной и той же функции. –

1

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

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'); 
Смежные вопросы