ECMAScript | Дизъюнкция (Disjunction) | Регулярные выражения (Regular Expression)

С параметром направления direction.

Производство Disjunction :: Alternative оценивается следующим образом:

1. Оцените Альтернативу Alternative с аргументом direction, чтобы получить Сопоставитель Matcher m.
2. Возврат m.


Производство Disjunction :: Alternative | Disjunction оценивается следующим образом:

1. Оцените Альтернативу Alternative с аргументом direction, чтобы получить Сопоставитель Matcher m1.
2. Оцените Дизъюнкцию Disjunction с аргументом direction, чтобы получить Сопоставитель Matcher m2.
3. Верните новый Сопоставитель Matcher с параметрами (x, c), который захватывает m1 и m2 и при вызове выполняет следующие шаги:
   а. Утверждено: x - это Состояние (State).
   b. Утверждено: c - это Продолжение (Continuation).
   c. Пусть r есть m1(x, c).
   d. Если r не является ошибкой failure, верните r.
   е. Верните m2(x, c).

 

Примечание

Оператор регулярного выражения | разделяет две альтернативы. Сначала Шаблон (Pattern) пытается сопоставить левую Альтернативу Alternative (за которой следует продолжение регулярного выражения); если это не удается, он пытается сопоставить правую Дизъюнкцию Disjunction (за которой следует продолжение регулярного выражения). Если левая Альтернатива Alternative, правая Дизъюнкция Disjunction и продолжение имеют точки выбора, все варианты в продолжении проверяются перед переходом к следующему варианту в левой альтернативе. Если варианты в левой Альтернативе исчерпаны, вместо левой Альтернативы пробуется правая Дизъюнкция. Любые захватывающие скобки внутри части Шаблона, пропущенные оператором | производят значения undefined вместо строк. Так, например,

/a|ab/.exec("abc")

возвращает результат «a», а не «ab». Более того,

/((a)|(ab))((c)|(bc))/.exec("abc")

возвращает массив

["abc", "a", "a", undefined, "bc", undefined, "bc"]

и не

["abc", "ab", undefined, "ab", "c", "c", undefined]

Порядок, в котором проверяются две альтернативы, не зависит от значения направления direction.

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

Стандарт ECMAScript — Раздел «Disjunction» — https://tc39.es/ecma262/#sec-disjunction

Поделись записью