/.?e.?/соответствует всей строке, а не ожидаемой подстроке

В Internet Explorer 10 это:

'abcdefghi'.match(/.?e.?/)

оценивает ['def'], как и следовало ожидать, но в Firefox 21.0 он оценивается как ['abcdefghi']. (См. этот jsFiddle.) Я получаю такое же неожиданное поведение для некоторых других регулярных выражений, которые начинаются и заканчиваются дополнительным контентом, например /.?e.{0,2}/ и /.{0,2}e.{0,2}/; однако комментаторы указывают на различные похожие регулярные выражения, такие как /\S?e\S?/ и /(?:.?e.?)/, которые не затрагиваются. То же самое относится к методу replace.

Я пропустил что-то очевидное? Есть ли какая-то серьезная причина такого поведения?

Ответ 1

Как сказал tiffon, это ошибка в SpiderMonkey (движок JavaScript JavaScript).

В SpiderMonkey мы используем механизм RegExp из движка JavaScript Safari JavaScriptCore и унаследовали от этого ошибку. Я зарегистрировал ошибку 119191 для ошибки в АО.

Ответ 2

Похож на ошибку. Я подал проблему.

Btw, работает следующая работа:

'abcdefghi'.match(/.e./)
'abcdefghi'.match(/.e.?/)
'abcdefghi'.match(/.?e./)
'abcdefghi'.match(/[a-z]?e.?/)
'abcdefghi'.match(/.?e[a-z]?/)

http://jsfiddle.net/afDqC/1/

Ответ 3

Как указывалось в других ответах, это кажется ошибкой.

Однако есть доступное решение: 'abcdefghi'.match(/(.?e.?)/)

Таким образом, вы получите правильные результаты как в [0] (неявная подгруппа, содержащая всю строку, согласованную с регулярным выражением), так и [1] (подгруппа, заданная ())