Подтвердить что ты не робот

Какие реализации ECMAScript расширяют синтаксис RegExp?

Итак, я знаю, что в JavaScript реализации разрешено расширять грамматику регулярных выражений:

Реализация может расширять грамматику регулярного выражения ECMAScript, определенную в 21.2.1, но она не должна расширять производные RegularExpressionBody и RegularExpressionFlags, определенные ниже, или производства, используемые этими производством.

Была ли эта способность когда-либо использована? Какие-либо существующие реализации JavaScript расширяют грамматику регулярных выражений?

4b9b3361

Ответ 1

Октальная escape-последовательность в RegExp

Широкое применение этого предложения (которое также представлено в спецификации ECMAScript 5.1, раздел 7.8.5), заключается в предоставлении восьмеричной escape-последовательности для конструктора RegExp.

/a\1b/.test("a\u0001b");
/a\11b/.test("a\tb");

Грамматика по умолчанию для RegExp (как описано в разделе 15.10.1 ES5.1 или Раздел 21.2.1 ES6) не поддерживает восьмеричную escape-последовательность и любую десятичную escape-последовательность, значение которой больше, чем количество захваченных групп, вызывает СинтаксисError. Тем не менее, многие браузеры (даже старые версии) расширяют грамматику RegExp для поддержки восьмеричной escape-последовательности и оценивают 2 строки кода выше true.

Начиная с ES6, Приложение B, которое раньше было информативным приложением в спецификациях ES3 и ES5.1, превращается в нормативное приложение, для чего требуется веб-браузер, чтобы поддерживать восьмеричную escape-последовательность по соображениям совместимости (не-веб-браузеры могут выбирать для реализации по умолчанию).

В то время как предыдущие версии ECMAScript ссылались на поддержку восьмеричной escape-последовательности, это было только для числовых и строковых литералов. Обратно-совместимый RegExp впервые описывает в раздел B.1.4 ES6, который изменяет семантику и синтаксис RegExp для шаблонов BMP для включения поддержка восьмеричной escape-последовательности, среди других функций.

Непревзойденные закрывающие скобки ] и квантификатор без диапазона с помощью {}

Другим распространенным расширением (как проверено на Firefox 38, Chrome 43 и IE9) является ослабление грамматики, чтобы позволить непревзойденные закрывающие скобки ] и последовательности, которые не являются квантованным номером, и интерпретировать их как литературные строки.

/^][[]]$/.test("][]"); // Tokens: ^  ]  [[]  ]  $
/^{56, 67}$/.test("{56, 67}"); // Extra space

Аналогично восьмеричной escape-последовательности, грамматика по умолчанию RegExp (раздел 15.10.1 из ES5.1 или раздел 21.2.1 ES6) не позволяет {, }, ] быть Atom, поскольку эти символы исключаются из производства PatternCharacter.

Грамматика в Раздел B Приложения B.1.4 ES6 также расширяется для интерпретации последовательностей кванторов без диапазона (последовательности, которые не сопоставить грамматику QuantifierPrefix) как литеральную строку, через Atom [U]:: PatternCharacter production.

Тем не менее расширенная грамматика не допускает непревзойденного закрытия ], поскольку и PatternCharacter, и PatternCharacterNoBrace все еще запрещают ].

Ответ 2

Да, движок Mozilla Gecko поддерживал липкий флаг y, который не был частью ES5. Это в конечном итоге стало частью ES6.

Эта способность может быть использована снова, когда двигатели начнут внедрять look-behind (надеюсь, они начнут экспериментировать, прежде чем они будут определены).

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