Странная проблема регулярных выражений - PullRequest
1 голос
/ 25 августа 2009

Следующий код выдает «undefined» для lastIndex:

var a = /cat/g;
var l = "A test sentence containing cat and dog.";
var r = a.exec(l);

document.write(r.lastIndex);

Однако он отлично работает для r.index (и r.input).

Я использую Firefox. У кого-нибудь есть подсказка?

РЕДАКТИРОВАТЬ: ОК, приведенный выше код отлично работает в IE! Кроме того, в Firefox это работает отлично, если вместо вызова r.lastIndex в строке 5 вызывается a.lastIndex. Похоже, что Firefox не возвращает свойство lastIndex в результате - скорее устанавливает свойство для шаблона, вызывающего только exec (). Интересно, что IE устанавливает оба.

Ответы [ 3 ]

4 голосов
/ 25 августа 2009

Это одно из тех мест, где Microsoft решила добавить кое-что к языку и действовать так, как будто он должен был быть там. К счастью, теперь они убирают свои действия и документируют такую ​​ерунду.

Чтобы быть ясным: Firefox корректен в соответствии с Спецификация языка ECMAScript 3-е издание (PDF, 705 КБ).

IE не правильно; его поведение является частным расширением. Нет никаких оснований полагать, что это специфичное для IE поведение когда-либо будет поддерживаться любым другим браузером. Это конечно не в данный момент. См. Отклонения JScript от ES3 (PDF, 580 КБ, от Пратапа Лакшмана из Microsoft Corporation) Раздел 4.6 для получения дополнительной информации об этом конкретном отклонении от спецификации, включая тесты, не показывающие поддержку в других браузерах.

Обратите также внимание, что в будущем это может даже не поддерживаться IE: ряд собственных механизмов IE, связанных с CSS, по умолчанию отключены в IE8-in-IE8-mode, и будущие реализации JScript могут найти причину аналогичным образом отключите это расширение для языка.

4 голосов
/ 25 августа 2009

lastIndex является свойством RegExp объекта Итак, попробуйте это:

a.lastIndex
0 голосов
/ 19 сентября 2009

Чтобы избежать всего странного, попробуйте это

var a = /cat/g;
var l = "A test sentence containing cat and dog.";
var r = a.exec(l);
var lastIndex = (r!=null) ? l.indexOf(r[0])+r[0].length : 0;

Используется здесь: http://www.pagecolumn.com/tool/regtest.htm

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