С параметром направления 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