ECMAScript | Конструктор Регулярных Выражений (The RegExp Constructor)

ECMAScript | Конструктор Регулярных Выражений (The RegExp Constructor)

Конструктор RegExp:

  • является %RegExp%.
  • является начальным значением свойства «RegExp» глобального объекта.
  • создает и инициализирует новый объект RegExp при вызове функции, а не конструктора. Таким образом, вызов функции RegExp(…) эквивалентен выражению создания объекта new RegExp(…) с теми же аргументами.
  • предназначен для создания подклассов. Его можно использовать как значение предложения extends определения класса. Конструкторы подкласса, которые намереваются наследовать указанное поведение RegExp, должны включать вызов super конструктора RegExp для создания и инициализации экземпляров подкласса с необходимыми внутренними слотами.

 

RegExp ( pattern, flags )

Выполняются следующие шаги:

1. Пусть patternIsRegExp будет ? IsRegExp(pattern).
2. Если NewTarget является undefined, тогда
   а. Пусть newTarget будет активным функциональным объектом.
   b. Если patternIsRegExp является true (истинно), а флаги являются undefined (не определены), то
      i. Пусть patternConstructor будет ? получить Get(pattern, "constructor").
      ii. Если SameValue(newTarget, patternConstructor) является true (истинно), вернуть шаблон pattern.
3. В противном случае пусть newTarget будет NewTarget.
4. Если тип Type(pattern) - это объект, а шаблон pattern имеет внутренний слот [[RegExpMatcher]], тогда
   а. Пусть P будет pattern.[[OriginalSource]].
   b. Если flags является undefined(не определен), пусть F будет pattern.[[OriginalFlags]].
   c. В противном случае пусть F будет флагами flags.
5. Иначе, если patternIsRegExp является true (истинно), тогда
   а. Пусть P будет ? получить Get(pattern, "source").
   b. Если flags является undefined(не определен), то
      i. Пусть F будет ? получить Get(pattern, "flags").
   c. В противном случае пусть F будет флагами flags.
6. Иначе,
   а. Пусть P - образец pattern.
   b. Пусть F - флаги flags.
7. Пусть О будет ? RegExpAlloc(newTarget).
8. Вернуть ? RegExpInitialize(O, P, F).

 

Примечание

Если шаблон предоставляется с использованием StringLiteral, обычные замены escape-последовательностей выполняются до обработки String с помощью RegExp. Если шаблон должен содержать escape-последовательность для распознавания RegExp, любые кодовые точки U+005C (REVERSE SOLIDUS) должны быть экранированы внутри StringLiteral, чтобы предотвратить их удаление при формировании содержимого StringLiteral.

 

Абстрактные операции для конструктора RegExp

 

22.2.3.2.1 RegExpAlloc ( newTarget )

Абстрактная операция RegExpAlloc (Распределение регулярного выражения) принимает аргумент newTarget. При вызове она выполняет следующие шаги:

1. Пусть obj будет ? OrdinaryCreateFromConstructor(newTarget, "%RegExp.prototype%", «[[RegExpMatcher]], [[OriginalSource]], [[OriginalFlags]]»).
2. Выполнить ! DefinePropertyOrThrow(obj, "lastIndex", PropertyDescriptor {[[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false}).
3. Вернуть obj.

 

22.2.3.2.2 RegExpInitialize ( obj, pattern, flags )

1. Если шаблон pattern является undefined(не определен), пусть P будет пустой строкой.
2. Иначе пусть P будет ? ToString(pattern).
3. Если flags является undefined(не определен), пусть F будет пустой строкой.
4. Иначе пусть F будет ? ToString(flags).
5. Если F содержит любую кодовую единицу, кроме «g», «i», «m», «s», «u» или «y», или если она содержит одну и ту же кодовую единицу более одного раза, бросить исключение SyntaxError.
6. Если F содержит «u», пусть u будет true (истинно); иначе пусть u будет false (ложь).
7. Если u является true (истинно), то
   а. Пусть patternText будет ! StringToCodePoints(P).
   b. Пусть patternCharacters будет Списком, элементы которого являются кодовыми точками patternText.
8. Иначе,
   а. Пусть patternText будет результатом интерпретации каждого из 16-битных элементов P как кодовой точки Unicode BMP. К элементам не применяется декодирование UTF-16.
   b. Пусть patternCharacters будет списком List, элементы которого являются элементами кодовой единицы P.
9. Пусть parseResult будет ParsePattern(patternText, u).
10. Если parseResult является непустым списком объектов SyntaxError, вызовите исключение SyntaxError.
11. Утверждено: parseResult - это узел синтаксического анализа для шаблона Pattern.
12. Установите для obj.[[OriginalSource]] значение P.
13. Установите для obj.[[OriginalFlags]] значение F.
14. Установите для obj.[[RegExpMatcher]] абстрактное замыкание, которое оценивает parseResult, применяя семантику, представленную в 22.2.2, используя patternCharacters в качестве списка значений SourceCharacter шаблона и F в качестве параметров флага.
15. Выполнить ? установить Set(obj, "lastIndex", +0𝔽, true).
16. Вернуть объект obj.

 

22.2.3.2.3 Static Semantics: ParsePattern ( patternText, u )

Абстрактная операция ParsePattern (Синтаксический анализ шаблона) принимает аргументы patternText (последовательность кодовых точек Unicode) и u (логическое значение). При вызове она выполняет следующие шаги:

1. Если u является true (истинно, то
а. Пусть parseResult будет ParseText(patternText, Pattern [+U, +N]).
2. Иначе,
   а. Пусть parseResult будет ParseText(patternText, Pattern [~U, ~N]).
   b. Если parseResult является узлом анализа, а parseResult содержит GroupName, тогда
      i. Установите parseResult в ParseText(patternText, Pattern [~U, +N]).
3. Верните parseResult.

 

22.2.3.2.4 RegExpCreate ( P, F )

Абстрактная операция RegExpCreate (Создать регулярное выражение) принимает аргументы P и F. При вызове она выполняет следующие шаги:

1. Пусть obj будет ? RegExpAlloc(%RegExp%).
2. Вернуть ? RegExpInitialize(obj , P, F).

 

22.2.3.2.5 EscapeRegExpPattern ( P, F )

Абстрактная операция EscapeRegExpPattern (Экранирующий шаблон регулярного выражения) принимает аргументы P и F. При вызове она выполняет следующие шаги:

1. Пусть S будет строкой в ​​форме Pattern [~ U] (Pattern [+ U], если F содержит "u"), эквивалентной P, интерпретируемой как кодовые точки Unicode в кодировке UTF-16 (6.1.4), в которых некоторые кодовые точки экранируются, как описано ниже. S может быть или не быть идентичным P; однако абстрактное замыкание, которое будет результатом оценки S как Pattern [~ U] (Pattern [+ U], если F содержит "u"), должно вести себя идентично абстрактному замыканию, заданному внутренним слотом [[RegExpMatcher]] построенного объекта. Множественные вызовы этой абстрактной операции с использованием одинаковых значений для P и F должны давать одинаковые результаты.
2. Кодовые точки / или любой LineTerminator, встречающийся в шаблоне, должен быть экранирован в S по мере необходимости, чтобы гарантировать, что конкатенация строк «/», S, «/» и F может быть синтаксически проанализирована (в соответствующем лексическом контексте), как RegularExpressionLiteral, который ведет себя идентично построенному регулярному выражению. Например, если P равно «/», тогда S может быть «\ /» или «\u002F», среди других возможностей, но не «/», потому что ///, за которым следует F, будет анализироваться как SingleLineComment, а не как RegularExpressionLiteral. Если P - пустая строка, эта спецификация может быть удовлетворена, если S будет "(?:)".
3. Верните S.

 

Информационные ссылки

Предыдущий раздел — Семантики Шаблона

Стандарт ECMAScript — Раздел «The RegExp Constructor» — https://tc39.es/ecma262/#sec-regexp-constructor

ECMAScript | Условные обозначения