Строка JavaScript странное поведение Exec - PullRequest
3 голосов
/ 11 мая 2010

имеют функцию в моем объекте, которая вызывается регулярно.

parse : function(html)
{
    var regexp = /...some pattern.../
    var match = regexp.exec(html);
    while (match != null)
    {
        ...
        match = regexp.exec(html);
    }
    ...
    var r = /...pattern.../g;
    var m = r.exec(html);
}

с неизмененным html m возвращает нулевой вызов друг друга. скажем

parse(html);// ok
parse(html);// m is null!!!
parse(html);// ok
parse(html);// m is null!!!
// ...and so on...

есть ли какой-нибудь индекс или что-то, что должно быть сброшено на html ... Я действительно запутался. Почему match всегда возвращает правильный результат?

Ответы [ 2 ]

3 голосов
/ 11 мая 2010

Это обычное поведение, когда вы работаете с шаблонами, имеющими глобальный флаг g, и используете методы exec или test.

В этом случае объект RegExp будет отслеживать lastIndex, где было найдено совпадение, и затем при последующих совпадениях он будет начинаться с этого lastIndex вместо того, чтобы начинаться с 0.

Редактировать: В ответ на ваш комментарий почему не воссоздается объект RegExp при повторном вызове функции :

Это поведение, описанное для литералов регулярных выражений , позвольте мне процитировать спецификацию:

& секта; 7.8.5 - Литералы регулярного выражения

...

Объект создается до начала оценки содержащейся программы или функции. Оценка литерала дает ссылку на этот объект; это не создает новый объект.

....

Вы можете сделать простое доказательство:

function createRe() {
  var re = /foo/g;
  return re;
}

createRe() === createRe(); // true, it's the same object

Вы можете быть уверены, что это один и тот же объект, потому что "два литерала регулярного выражения в программе оцениваются как объекты регулярного выражения, которые никогда не сравниваются как === друг с другом, даже если содержимое двух литералов одинаково" , например:

/foo/ === /foo/; // always false...

Однако это поведение соблюдается во всех браузерах, кроме IE, который каждый раз инициализирует новый объект RegExp.

1 голос
/ 13 февраля 2012

Чтобы избежать такого поведения, которое может потребоваться в этом случае, просто установите

var r = /...pattern.../g;
var m = r.exec(html);
r.lastIndex=0;

Это сработало для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...