Объект RegExp содержит регулярное выражение и связанные с ним флаги.
ПРИМЕЧАНИЕ Вид и функциональные возможности регулярных выражений созданы по образцу средств регулярных выражений в языке программирования Perl 5.
Конструктор RegExp
применяет к входной строке-шаблону следующую грамматику. Если грамматика не может интерпретировать строку как развёртывание шаблона Pattern, происходит ошибка.
Синтаксис
Pattern ::
Disjunction
Disjunction ::
Alternative
Alternative |
Disjunction
Alternative ::
[пусто]
Alternative Term
Term ::
Assertion
Atom
Atom Quantifier
Assertion ::
^
$
\ b
\ B
(?
=
Disjunction )
(
?
!
Disjunction )
Quantifier ::
QuantifierPrefix
QuantifierPrefix?
QuantifierPrefix ::
*
+?
{
DecimalDigits }
{
DecimalDigits,
}
{
DecimalDigits,
DecimalDigits }
Atom ::
PatternCharacter.
\
AtomEscape
CharacterClass
Disjunction
()
(
?
:
Disjunction )
PatternCharacter ::SourceCharacter но не один из следующих:
^ $ \ . * + ? ( ) [ ] { } |
AtomEscape ::
DecimalEscape
CharacterEscape
CharacterClassEscape
CharacterEscape ::
ControlEscapec
ControlLetter
HexEscapeSequence
UnicodeEscapeSequence
IdentityEscape
SingleEscapeCharacter :: один из
f n r t v
ControlLetter :: один из
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
IdentityEscape ::
SourceCharacter но не IdentifierPart
<ZWJ>
<ZWNJ>
DecimalEscape ::
DecimalIntegerLiteral [lookahead ∉ DecimalDigit]
CharacterClassEscape :: один из
d D s S w W
CharacterClass ::
[
[lookahead ∉ {^
}] ClassRanges
]
[ ^
ClassRanges]
ClassRanges ::
[пусто]
NonemptyClassRanges
NonemptyClassRanges ::
ClassAtom
ClassAtom NonemptyClassRangesNoDash
ClassAtom-
ClassAtom ClassRanges
NonemptyClassRangesNoDash ::
ClassAtom
ClassAtomNoDash NonemptyClassRangesNoDash
ClassAtomNoDash-
ClassAtom ClassRanges
ClassAtom ::
-
ClassAtomNoDash
ClassAtomNoDash ::
SourceCharacter но не один из \
или ]
или -
\
ClassEscape
ClassEscape ::
DecimalEscapeb
CharacterEscape
CharacterClassEscape
Шаблон регулярного выражения преобразуется во внутреннюю процедуру с помощью описанных ниже алгоритмов. Реализации рекомендуется использовать более эффективные алгоритмы, чем представленные ниже, если их результат будет таким же. Внутренняя процедура используется в качестве значения внутреннего свойства [[Match]] объекта RegExp.
В приведённых ниже описаниях используются следующие переменные:
Input – строка, в которой производится поиск совпадения с шаблоном регулярного выражения. Запись input[n] означает символ номер n строки input, где n может находиться в диапазоне от 0 включительно до InputLength (не включительно).
InputLength – количество символов в строке Input.
NcapturingParens – общее количество открывающих захватывающих скобок (то есть, общее количество развёртываний правила Atom :: (
Disjunction )
) в шаблоне. Открывающая захватывающая скобка – символ шаблона (
, которому соответствует терминал (
правила Atom :: (
Disjunction )
.
IgnoreCase – установочное значение свойства ignoreCase
игнорировать регистр объекта RegExp.
Multiline – установочное значение свойства multiline
многострочный объекта RegExp.
Кроме того, в приведённых ниже описаниях используются следующие внутренние структуры данных:
CharSet набор символов представляет собой математический набор символов.
State состояние – упорядоченная пара (endIndex, captures), где endIndex – целое число, а captures – внутренний массив значений в количестве NcapturingParens. Состояния states используются для представления состояний частичного совпадения в алгоритмах нахождения совпадений с регулярным выражением. Значение endIndex на единицу больше, чем индекс последнего на данный момент входного символа, совпадающего с шаблоном, а captures хранит результаты захватывающих скобок. Элемент номер n из captures либо равен строке, представляющей собой значение, полученное n-ным набором захватывающих скобок, либо равен undefined, если n-ный набор захватывающих скобок еще не был достигнут. Поскольку производится поиск с возвратами, в процессе поиска совпадений в любой момент может использоваться несколько состояний States.
MatchResult результат совпадения представляет собой либо State, либо специальный токен failure, который указывает на то, что поиск совпадений оказался неуспешным.
Процедура Continuation продолжение представляет собой внутреннее замкнутое выражение (то есть, внутреннюю процедуру, у которой некоторые аргументы уже привязаны к значениям), принимающее один аргумент State и возвращающее результат MatchResult. Если внутреннее замкнутое выражение ссылается на переменные, привязанные к функции, создавшей это замкнутое выражение, то это выражение будет использовать значения этих переменных в момент создания этого замкнутого выражения. Continuation предпринимает попытку найти совпадения с оставшейся частью шаблона (заданной аргументами, уже привязанными к замкнутому выражению) во входной строке, начиная с промежуточного состояния, указанного его аргументом State. Если совпадение было успешно найдено, то Continuation возвращает последний достигнутый State, если же поиск совпадений оказался неуспешным, то Continuation возвращает failure.
Процедура Matcher обнаружитель совпадений представляет собой внутреннее замкнутое выражение, принимающее два аргумента – State и Continuation, и возвращающее результат MatchResult. Matcher предпринимает попытку найти совпадения со средним подшаблоном (заданным аргументами, уже привязанными к замкнутому выражению) во входной строке, начиная с промежуточного состояния, указанного его аргументом State. Аргумент Continuation должен быть замкнутыми выражением, который ищет совпадения с оставшейся частью шаблона. После нахождения совпадения с подшаблоном для получения нового State, Matcher вызывает для этого нового State продолжение Continuation, чтобы проверить, можно ли найти совпадение и в оставшейся части шаблона. Если это возможно, обнаружитель совпадений возвращает State, полученное в результате вызова Continuation. Если это невозможно, Matcher может в точках выбора попробовать сделать другой выбор, постоянно вызывая Continuation то тех пор, пока либо эта процедура не увенчается успехом, либо все варианты будут исчерпаны.
Процедура AssertionTester тестер утверждений представляет собой внутреннее замкнутое выражение, принимающее аргумент State и возвращающее булев результат. Это тестер утверждений проверяет особое условие (заданное аргументами, уже привязанными к замкнутому выражению) в текущем месте входной строки, и возвращает true при совпадении условия, и false, если условие на выполняется.
EscapeValue значение escape представляет собой либо символ, либо целое число. EscapeValue используется для обозначения способа интерпретации управляющей последовательности DecimalEscape: символ ch означает, что управляющая последовательность интерпретируется как символ ch, а целое число n означает, что управляющая последовательность интерпретируется как обратная ссылка на n-ный набор захватывающих скобок.
Для вычисления Pattern:: Disjunction выполняются следующие шаги:
Вычислить Disjunction , получив в результате Matcher m.
Вернуть внутреннее замкнутое выражение, принимающее два аргумента – строку str и целое число index, и выполняющее следующие действия:
Пусть Input будет заданной строкой str. Эта переменная будет использоваться во всех алгоритмах в пункте 15.10.2.
Пусть InputLength будет длиной для Input. Эта переменная будет использоваться во всех алгоритмах в пункте 15.10.2.
Пусть c будет Continuation, которое всегда возвращает свой аргумент State в качестве успешного результата совпадений MatchResult.
Пусть cap будет внутренним массивом из значений undefined в количестве NcapturingParens с индексом от 1 до NcapturingParens.
Пусть x будет State (index, cap).
Вызвать m(x, c) и вернуть результат.
ПРИМЕЧАНИЕ Шаблон вычисляет ("компилирует") значение внутренней процедуры. Затем RegExp.prototype.exec
может применить эту процедуру к строке и к смещению в этой строке, чтобы определить, будет ли найдено соответствие для шаблона, если начать именно с места смещения, и, если да – то какими будут значения захватывающих скобок. Алгоритмы в пункте 15.10.2 рассчитаны на то, чтобы при компиляции шаблона было возможно сгенерировать исключение SyntaxError. С другой стороны, после того, как компиляция шаблона была успешно произведена, применение результирующей внутренней процедуры для нахождения соответствия в строке не может сгенерировать исключения (кроме исключений, заданных средой, которые могут возникнуть где угодно – например, исключительная ситуация из-за нехватки памяти).
Для вычисления Disjunction :: Alternative производится вычисление Alternative для получения Matcher, а затем возврат этого Matcher.
Для вычисления Disjunction :: Alternative |
Disjunction выполняются следующие шаги:
Вычислить Alternative для получения Matcher m1.
Вычислить Disjunction для получения Matcher m2.
Вернуть внутреннее замкнутое выражение Matcher, принимающее два аргумента – State x и Continuation c, и выполнить следующие шаги:
Вызвать m1(x, c), и пусть r будет его результатом.
Если r не равно failure, вернуть r.
Вызвать m2(x, c) и вернуть результат.
ПРИМЕЧАНИЕ Оператор регулярного выражения |
разделяет две альтернативы. Сначала шаблон пытается найти совпадение с левой альтернативой 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]
Для вычисления Alternative :: [пусто] производится возврат Matcher, принимающего два аргумента – State x и Continuation c, и возвращающего результат вызова c(x).
Для вычисления Alternative :: Alternative Term выполняются следующие шаги:
Вычислить Alternative для получения Matcher m1.
Вычислить Term для получения Matcher m2.
Вернуть внутреннее замкнутое выражение Matcher, принимающее два аргумента – State x и Continuation c, и выполняющее следующие шаги:
Создать Continuation d, принимающее аргумент State y и возвращающее результат вызова m2(y, c).
Вызвать m1(x, d) и вернуть результат.
ПРИМЕЧАНИЕ Последовательно следующие друг за другом Terms пытаются одновременно соответствовать последовательным частям входной строки. Если точки выбора есть и в левом Alternative, и в правом элементе Term, и в продолжении регулярного выражения, то перед тем, как переходить к следующему варианту выбора в правом Term, необходимо попробовать все варианты выбора в продолжении, и прежде чем перейти к следующему варианту выбора в левом Alternative, необходимо проверить все варианты выбора в правом Term.
Для вычисления Term ::Assertion вернуть внутреннее замкнутое выражение Matcher, принимающее два аргумента – State x и Continuation c, и выполняющее следующие шаги:
Вычислить Assertion для получения AssertionTester t.
Вызвать t(x), и пусть r будет полученным булевым значением.
Если r равно false, вернуть failure.
Вызвать c(x) и вернуть результат.
Для вычисления Term ::Atom производится вычисление Atom для получения Matcher, а затем возврат этого Matcher.
Для вычисления Term ::Atom Quantifier выполняются следующие шаги:
Вычислить Atom для получения Matcher m.
Вычислить Quantifier и получить три результата: целое min, целое (или ∞) max, и булево greedy.
Если max – конечное число, меньшее чем min, сгенерировать исключение SyntaxError.
Пусть parenIndex будет количеством открывающих захватывающих скобок во всём регулярном выражении, которые находятся слева от элемента Term этого правила. Оно равно общему количеству раз, когда правило Atom :: (
Disjunction )
развёртывалось до элемента Term этого правила, плюс общее количество раз, когда этот элемент Term вложен в правило Atom :: (
Disjunction )
.
Пусть parenCount будет количеством открывающих захватывающих скобок в развёртывании атома Atom этого правила. Оно равно общему количеству раз, когда правило Atom :: (
Disjunction )
вложено в атом Atom этого правила.
Вернуть внутреннее замкнутое выражение Matcher, принимающее два аргумента – State x и Continuation c, и выполнить следующие шаги:
Вызвать RepeatMatcher(m, min, max, greedy, x, c, parenIndex, parenCount) и вернуть результат.
Абстрактная операция RepeatMatcher принимает восемь параметров – Matcher m, целое min, целое (или ∞) max, булево greedy, State x, Continuation c, целое parenIndex, и целое parenCount, и выполняет следующие действия:
Если max равно нулю, то вызвать c(x) и вернуть результат.
Создать внутреннее замкнутое выражение Continuation d, принимающее один аргумент State y, и выполняющее следующие действия:
Если min равно нулю, а endIndex для y равно endIndex для x, вернуть failure.
Если min равно нулю, пусть min2 будет ноль; в противном случае пусть min2 будет min–1.
Если max равно ∞, пусть max2 будет ∞; в противном случае пусть max2 будет max–1.
Вызвать RepeatMatcher(m, min2, max2, greedy, y, c, parenIndex, parenCount) и вернуть результат.
Пусть cap будет новой копией внутреннего массива captures для x.
Для каждого целого числа k, удовлетворяющего условиям parenIndex < k и k ≤ parenIndex+parenCount, установить значение cap[k] равное undefined.
Пусть e будет endIndex для x.
Пусть xr будет State (e, cap).
Если min не равно нулю, вызвать m(xr, d) и вернуть результат.
Если greedy равно false, то
Вызвать c(x), и пусть z будет результатом.
Если z не равно failure, вернуть z.
Вызвать m(xr, d) и вернуть результат.
Вызвать m(xr, d), и пусть z будет результатом.
Если z не равно failure, вернуть z.
Вызвать c(x) и вернуть результат.
ПРИМЕЧАНИЕ Quantifier указывает, сколько раз за атомом Atom следует Quantifier. Квантификатор Quantifier может быть "нежадным" non-greedy – в этом случае шаблон Atom повторяется наименьшее возможное количество раз, при котором он совпадает с продолжением регулярного выражения. Либо он может быть "жадным" greedy, и в этом случае он повторяется наибольшее возможное количество раз, при котором он совпадает с продолжением. Повторяется шаблон Atom, а не входная строка, с которой он совпадает, поэтому различные повторения Atom могут совпадать с различными входными подстроками.
ПРИМЕЧАНИЕ 2 Если точки выбора альтернативы есть и у Atom, и у продолжения регулярного выражения, то сначала поиск совпадений производится в Atom в течение наиболее возможного количества раз (или наименее возможного количества раз, если квантификатор "нежадный"). Прежде чем переходить к следующему варианту выбора в последнем повторении Atom, необходимо проверить все варианты выбора в продолжении регулярного выражения. Необходимо проверить все варианты выбора последнего (n-ного) повторения Atom, прежде чем переходить к следующему варианту выбора в следующем повторении Atom (номер n–1). В этот момент может оказаться, что теперь доступно большее или меньшее количество повторений Atom. Тогда необходимо исчерпать все эти повторения (опять начиная либо с наименее возможного, либо с наиболее возможного количества раз), прежде чем переходить к следующему варианту выбора в повторении Atom номер n-1, и так далее.
Сравните
/a[a-z]{2,4}/.exec("abcdefghi")
где возвращается "abcde"
, с
/a[a-z]{2,4}?/.exec("abcdefghi")
где возвращается "abc"
.
Также обратите внимание на
/(aa|aabaac|ba|b|c)*/.exec("aabaac")
которое, с учётом указанного выше порядка точки выбора возвращает массив
["aaba", "ba"]
а не один из нижеперечисленных массивов:
["aabaac", "aabaac"]
["aabaac", "c"]
Вышеуказанный порядок точки выбора может быть использован для написания регулярного выражения, вычисляющего наибольший общий делитель из двух чисел (в унарной записи). В следующем примере вычисляется наибольший общий делитель для 10 и 15:
"aaaaaaaaaa,aaaaaaaaaaaaaaa".replace(/^(a+)\1*,\1+$/,"$1")
возвращающий наибольший общий делитель в унарной записи "aaaaa"
.
ПРИМЕЧАЕНИЕ 3 Каждый раз при повторении Atom выполнение шага 4 из RepeatMatcher очищает captures в элементе Atom. Можно увидеть его поведение в следующем регулярном выражении:
/(z)((a+)?(b+)?(c))*/.exec("zaacbbbcac")
которое возвращает массив
["zaacbbbcac", "z", "ac", "a", undefined, "c"]
а не
["zaacbbbcac", "z", "ac", "a", "bbb", "c"]
потому что каждая итерация самого крайнего *
очищает все захваченные строки, содержащиеся в квантифицированном Atom, который в этом случае включает в себя захватываемые строки номер 2, 3 и 4.
ПРИМЕЧАНИЕ 4 Шаг 1 замкнутого выражения d из RepeatMatcher утверждает, что как только было получено минимальное количество повторений, для дальнейших повторений больше не рассматриваются развёртывания Atom, совпадающие с пустой строкой. Это не позволяет механизму регулярного выражения оказаться в бесконечном цикле с такими шаблонами, как:
/(a*)*/.exec("b")
или с чуть более сложным:
/(a*)b\1+/.exec("baaaac")
который возвращает массив
["b", ""]
Для вычисления Assertion :: ^
возвращается внутреннее замкнутое выражение AssertionTester, принимающее аргумент x для State, и выполняются следующие действия:
Пусть e будет endIndex для x.
Если e равно нулю, вернуть true.
Если Multiline равно false, вернуть false.
Если символ Input[e–1] является одним из LineTerminator, вернуть true.
Вернуть false.
Для вычисления Assertion :: $
возвращается внутреннее замкнутое выражение AssertionTester, принимающее аргумент x для State, и выполняются следующие действия:
Пусть e будет endIndex для x.
Если e равно InputLength, вернуть true.
Если multiline равно false, вернуть false.
Если символ Input[e] является одним из LineTerminator, вернуть true.
Вернуть false.
Для вычисления Assertion :: \ b
возвращается внутреннее замкнутое выражение AssertionTester, принимающее аргумент x для State, и выполняются следующие действия:
Пусть e будет endIndex для x.
Вызвать IsWordChar(e–1), и пусть a будет булевым результатом.
Вызвать IsWordChar(e) и пусть b будет булевым результатом.
Если a равно true и b равно false, вернуть true.
Если a равно false и b равно true, вернуть true.
Вернуть false.
Для вычисления Assertion :: \ B
возвращается внутреннее замкнутое выражение AssertionTester, принимающее аргумент x для State, и выполняются следующие действия:
Пусть e будет endIndex для x.
Вызвать IsWordChar(e–1), и пусть a будет булевым результатом.
Вызвать IsWordChar(e) и пусть b будет булевым результатом.
Если a равно true, а b равно false, вернуть false.
Если a равно false, а b равно true, вернуть false.
Вернуть true.
Для вычисления Assertion :: ( ? =
Disjunction)
выполняются следующие шаги:
Вычислить Disjunction для получения Matcher m.
Вернуть внутреннее замкнутое выражение Matcher, принимающее два аргумента – State x и Continuation c, и выполнить следующие шаги:
Пусть d будет Continuation, которое всегда возвращает свой аргумент State в качестве успешного результата совпадений MatchResult.
Вызвать m(x, d) и пусть r будет результатом.
Если r равно failure, вернуть failure.
Пусть y будет State для r.
Пусть cap будет внутренним массивом captures для y.
Пусть xe будет endIndex для x.
Пусть z будет State (xe, cap).
Вызвать c(z) и вернуть результат.
Для вычисления Assertion ::( ? !
Disjunction)
выполняются следующие шаги:
Вычислить Disjunction для получения Matcher m.
Вернуть внутреннее замкнутое выражение Matcher, принимающее два аргумента – State x и Continuation c, и выполнить следующие шаги:
Пусть d будет Continuation, которое всегда возвращает свой аргумент State в качестве успешного результата совпадений MatchResult.
Вызвать m(x, d) и пусть r будет результатом.
Если r не равно failure, вернуть failure.
Вызвать c(x) и вернуть результат.
Абстрактная операция IsWordChar принимает целочисленный параметр e и производит следующие действия:
Если e == –1 или e == InputLength, вернуть false.
Пусть c будет символом Input[e].
Если c является одним из ниже перечисленных шестидесяти трёх символов, вернуть true.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Вернуть false.
Для вычисления Quantifier :: QuantifierPrefix выполняются следующие шаги:
Вычислить QuantifierPrefix и получить два результата: целое min и целое (или ∞) max.
Вернуть три результата min , max, и true.
Для вычисления Quantifier :: QuantifierPrefix?
выполняются следующие шаги:
Вычислить QuantifierPrefix и получить два результата: целое min и целое (или ∞) max.
Вернуть три результата: min , max, и false.
Для вычисления QuantifierPrefix :: *
возвращается два результата: 0 и ∞.
Для вычисления QuantifierPrefix :: +
возвращается два результата: 1 и ∞.
Для вычисления QuantifierPrefix :: ?
возвращается два результата: 0 и 1.
Для вычисления QuantifierPrefix :: {
DecimalDigits}
выполняются следующие шаги:
Вернуть два результата: i и i. (Return the two results i and i.)
Для вычисления QuantifierPrefix :: {
DecimalDigits, }
выполняются следующие шаги:
Пусть i будет MV для DecimalDigits.
Вернуть два результата: i и ∞.
Для вычисления QuantifierPrefix :: {
DecimalDigits,
DecimalDigits}
выполняются следующие шаги:
Пусть i будет MV для первого DecimalDigits.
Пусть j будет MV для второго DecimalDigits.
Вернуть два результата: i и j.
Для вычисления Atom ::PatternCharacter выполняются следующие шаги:
Пусть ch будет символом, представленным PatternCharacter.
Пусть A будет одноэлементным CharSet, содержащим символ ch.
Вызвать CharacterSetMatcher(A, false) и вернуть результат Matcher.
Для вычисления Atom ::.
выполняются следующие шаги:
Пусть A будет набором всех символов, кроме LineTerminator.
Вызвать CharacterSetMatcher(A, false) и вернуть результат Matcher.
Для вычисления Atom ::\
AtomEscape производится вычисление AtomEscape для получения Matcher, а затем возврат этого Matcher.
Для вычисления Atom ::CharacterClass выполняются следующие шаги:
Вычислить CharacterClass, чтобы получить CharSet A и булево invert.
Вызвать CharacterSetMatcher(A, invert) и вернуть результат Matcher.
Для вычисления Atom ::(
Disjunction)
выполняются следующие шаги:
Вычислить Disjunction для получения Matcher m.
Пусть parenIndex будет количеством открывающих захватывающих скобок во всём регулярном выражении, которые находятся слева от начальной левой скобки этого правила. Оно равно общему количеству раз, когда правило Atom :: (
Disjunction )
развёртывалось до Atom этого правила, плюс общее количество раз, когда этот Atom вложен в правило Atom :: (
Disjunction )
.
Вернуть внутреннее замкнутое выражение Matcher, принимающее два аргумента – State x и Continuation c, и выполняющее следующие шаги:
Создать внутреннее замкнутое выражение Continuation d, принимающее один аргумент State y, и выполняющее следующие шаги:
Пусть cap будет новой копией внутреннего массива captures для y.
Пусть xe будет endIndex для x.
Пусть ye будет endIndex для y.
Пусть s будет новой строкой, символами которой являются символы Input в позициях с xe (включительно) по ye (не включительно).
Установить cap[parenIndex+1] в значение s.
Пусть z будет State (ye, cap).
Вызвать c(z) и вернуть результат.
Вызвать m(x, d) и вернуть результат.
Для вычисления Atom ::( ? :
Disjunction производится вычисление Disjunction для получения Matcher, а затем возврат этого Matcher.
Абстрактная операция CharacterSetMatcher принимает два аргумента – CharSet A и булев флаг invert, и выполняет следующие действия:
Вернуть внутреннее замкнутое выражение Matcher, принимающее два аргумента – State x и Continuation c, и выполнить следующие шаги:
Пусть e будет endIndex для x.
Если e == InputLength, вернуть failure.
Пусть ch будет символом Input[e].
Пусть cc будет результатом Canonicalize(ch).
Если invert равно false, вернуть
Если не существует такого элемента a в наборе A, чтобы Canonicalize(a) == cc, вернуть failure.
Иначе invert равно true.
Если существует такой элемент a в наборе A, чтобы Canonicalize(a) == cc, вернуть failure.
Пусть cap будет внутренним массивом captures для x.
Пусть y будет State (e+1, cap).
Вызвать c(y) и вернуть результат.
Абстрактная операция Canonicalize принимает символьный параметр ch и выполняет следующие шаги:
Если IgnoreCase равно false, вернуть ch.
Пусть u будет преобразованным в верхний регистр ch, как если бы посредством вызова стандартного встроенного метода String.prototype.toUpperCase
для состоящей из одного символа строки ch.
Если u состоит не из одного символа, вернуть ch.
Пусть cu будет символом для u.
Если кодовое значение символа ch больше или равно десятичному 128, и кодовое значение символа cu меньше десятичного 128, вернуть ch.
Вернуть cu.
ПРИМЕЧАНИЕ 1 Скобки формата (
Disjunction)
служат как для группировки компонентов шаблона Disjunction, так и для сохранения результатов поиска совпадений. Этот результат либо может быть использован в обратной ссылке (символ \
, за которым следует ненулевое десятичное число), на которую ссылается заменяющая строка, либо возвращён как часть массива из регулярного выражения, совпадающего с внутренней процедурой. Для запрета захватывающего поведения скобок используется формат (?:
Disjunction)
.
ПРИМЕЧАНИЕ 2 Формат (?=
Disjunction)
означает положительный предпросмотр нулевой ширины. Чтобы он увенчался успехом, шаблон внутри Disjunction должен совпадать в текущей позиции, но текущая позиция не перемещается вперёд, прежде чем она совпадёт с продолжением. Если Disjunction может иметь несколько совпадений в текущей позиции, проверяется только первое из них. В отличие от других операторов регулярного выражения, здесь отсутствует поиск с возвратами в формат (?=
(это необычное поведение унаследовано из языка Perl). Это имеет значение только в том случае, если Disjunction содержит захватывающие скобки, а продолжение шаблона содержит обратные ссылки на эти захватывающие скобки.
Например,
/(?=(a+))/.exec("baaabac")
совпадает с пустой строкой сразу же после первого b
, и поэтому возвращает массив:
["", "aaa"]
Чтобы проиллюстрировать отсутствие поиска с возвратами в предпросмотре, рассмотрим следующее выражение:
/(?=(a+))a*b\1/.exec("baaabac")
Это выражение возвращает
["aba", "a"]
а не
["aaaba", "a"]
ПРИМЕЧАНИЕ 3 Формат (?!
Disjunction)
означает отрицательный предпросмотр нулевой ширины. Чтобы он был успешным, шаблон в дизъюнкции Disjunction не должен содержать совпадения в текущей позиции. Текущая позиция не перемещается вперёд до поиска соответствия в продолжении. Disjunction может содержать захватывающие скобки, но обратные ссылки на них имеют смысл только из самого Disjunction. Обратные ссылки на эти захватывающие скобки из любого другого места в шаблоне всегда возвращают undefined, поскольку, чтобы для этого шаблона нашлось соответствие, отрицательный предпросмотр должен оказаться неуспешным. Например,
/(.*?)a(?!(a+)b\2c)\2(.*)/.exec("baaabaac")
ищет a
, сразу же за которой не идёт последовательность из некоторого положительного количества n символов a
, символа b
, ещё одного количества n символов a
(заданного первой ссылкой \2
) и символа c
. Вторая последовательность \2
находится за пределами отрицательного предпросмотра, поэтому она ищет совпадение с undefined и поэтому всегда оказывается находит. Всё выражение возвращает массив:
["baaabaac", "ba", undefined, "abaac"]
При поиске совпадений, где регистр не имеет значения, все символы непосредственно перед сравнением явным образом преобразуются в верхнему регистру. Однако, если при преобразовании символа в верхний регистр он разрастётся до более чем одного символа (например, как в случае с символом "ß"
(\u00DF
), который преобразуется в "SS"
), то этот символ остаётся без изменений. Кроме того, символ также остаётся без изменений, если он не является символом ASCII, но в результате его преобразования в верхний регистр он превратился бы в символ ASCII. Это позволяет избежать того, чтобы такие символы Юникода, как \u0131
и \u017F
не совпадали с регулярным выражением /[a z]/i
, которые должны соответствовать только буквам ASCII. Более того, если бы такие преобразования были разрешены, то /[^\W]/i
совпадали бы с любым символом из a
, b
, …, h
, но не с i
или s
.
Для вычисления AtomEscape :: DecimalEscape выполняются следующие шаги:
Вычислить DecimalEscape для получения EscapeValue E.
Если E – символ, то
Пусть ch будет символом для E.
Пусть A будет одноэлементным CharSet, содержащим символ ch.
Вызвать CharacterSetMatcher(A, false) и вернуть результат Matcher.
E должно быть целым числом. Пусть n будет этим целым числом.
Если n=0 или n>NCapturingParens, сгенерировать исключение SyntaxError.
Вернуть внутреннее замкнутое выражение Matcher, принимающее два аргумента – State x и Continuation c, и выполнить следующие шаги:
Пусть cap будет внутренним массивом captures для x.
Пусть s будет cap[n].
Если s равно undefined, вызвать c(x) и вернуть результат.
Пусть e будет endIndex для x.
Пусть len будет длиной для s.
Пусть f будет e+len.
Если f>InputLength, вернуть failure.
Если существует такое целое число i между 0 (включительно) и len (не включительно), чтобы Canonicalize(s[i]) не являлось таким же символом, что и Canonicalize(Input [e+i]), то вернуть failure.
Пусть y будет State (f, cap).
Вызвать c(y) и вернуть результат.
Для вычисления AtomEscape :: CharacterEscape выполняются следующие шаги:
Вычислить CharacterEscape, чтобы получить символ ch.
Пусть A будет одноэлементным CharSet, содержащим символ ch.
Вызвать CharacterSetMatcher(A, false) и вернуть результат Matcher.
Для вычисления AtomEscape :: CharacterClassEscape выполняются следующие шаги:
Вычислить CharacterClassEscape, чтобы получить CharSet A.
Вызвать CharacterSetMatcher(A, false) и вернуть результат Matcher.
ПРИМЕЧАНИЕ Управляющая последовательность, представляющая собой \
с последующим ненулевым десятичным числом n, соответствует результату n-ного набора захватывающих скобок (см. 15.10.2.11). Если регулярное выражение имеет меньше захватывающих скобок, чем n, это является ошибкой. Если регулярное выражение имеет n или более захватывающих скобок, но значение n-ной захватывающей скобки является undefined, поскольку она ничего не захватила, то обратная ссылка всегда считается успешной.
Для вычисления CharacterEscape :: ControlEscape возвращается символ в соответствии с Таблицей 23
ControlEscape |
Кодовая единица |
Наименование |
Символ |
|
|
горизонтальная табуляция |
<HT> |
|
|
перевод строки (новая строка) |
<LF> |
|
|
вертикальная табуляция |
<VT> |
|
|
перевод страницы |
<FF> |
|
|
возврат каретки |
<CR> |
Для вычисления CharacterEscape :: c
ControlLetter выполняются следующие шаги:
Пусть ch будет символом, представленным посредством ControlLetter.
Пусть i будет значением кодовой единицы ch.
Пусть j будет остатком от деления i на 32.
Вернуть кодовую единицу под номером j.
Для вычисления CharacterEscape :: HexEscapeSequence вычислить CV для HexEscapeSequence (см. 7.8.4) и вернуть реузльтат его символа.
Для вычисления CharacterEscape :: UnicodeEscapeSequence вычислить CV для UnicodeEscapeSequence (см. 7.8.4) и вернуть реузльтат его символа.
Для вычисления CharacterEscape :: IdentityEscape вернуть символ, представленный посредством IdentityEscape.
Для вычисления DecimalEscape :: DecimalIntegerLiteral [lookahead ∉ DecimalDigit] выполняются следующие шаги:
Пусть i будет MV для DecimalIntegerLiteral.
Если i равно нулю, вернуть EscapeValue, состоящее из символа <NUL> (значение Юникода 0000).
Вернуть EscapeValue, состоящее из целого числа i.
Определение MV для DecimalIntegerLiteral” приведено в 7.8.3.
ПРИМЕЧАНИЕ Если после символа \
следует десятичное число n, первая цифра которого не равна 0
, то управляющая последовательность считается обратной ссылкой. Если n больше, чем общее количество открывающих захватывающих скобок во всём регулярном выражении, это является ошибкой. Псоледовательность \0
представляет символ <NUL>; после него не может следовать десятичная цифра.
Для вычисления CharacterClassEscape :: d
возвращается набор символов из десяти элементов, содержащий символы от 0
до 9
включительно.
Для вычисления CharacterClassEscape :: D
возвращается набор всех символов, не входящих в набор, возвращаемый посредством :: d
.
Для вычисления CharacterClassEscape :: s
возвращаются набор символов, содержащий символы, расположенные с правой стороны от правил WhiteSpace (7.2) или LineTerminator (7.3).
Для вычисления CharacterClassEscape :: S
возвращается набор всех символов, не входящих в набор, возвращаемый посредством :: s
.
Для вычисления CharacterClassEscape :: w
возвращается набор символов, содержащий шестьдесят три символа:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Для вычисления CharacterClassEscape :: W
возвращается набор всех символов, не входящих в набор, возвращаемый посредством :: w
.
Для вычисления CharacterClass :: [
[lookahead ∉ {^}] ClassRanges
]
вычисляется ClassRanges, чтобы получить CharSet и вернуть этот CharSet и булево false.
Для вычисления CharacterClass :: [ ^
ClassRanges]
вычисляется ClassRanges, чтобы получить CharSet и вернуть этот CharSet и булево true.
Для вычисления ClassRanges:: [empty] возвращается пустой CharSet.
Для вычисления ClassRanges:: NonemptyClassRanges вычисляется NonemptyClassRanges, чтобы получить CharSet и вернуть этот CharSet.
Для вычисления NonemptyClassRanges :: ClassAtom вычисляется ClassAtom, чтобы получить CharSet и вернуть этот CharSet.
Для вычисления NonemptyClassRanges :: ClassAtom NonemptyClassRangesNoDash выполняются следующие шаги:
Вычислить ClassAtom, чтобы получить CharSet A.
Вычислить NonemptyClassRangesNoDash, чтобы получить CharSet B.
Для вычисления NonemptyClassRanges :: ClassAtom-
ClassAtom ClassRanges выполняются следующие шаги:
Вычислить первый ClassAtom, чтобы получить CharSet A.
Вычислить второй ClassAtom, чтобы получить CharSet B.
Вычислить ClassRanges, чтобы получить CharSet C.
Вызвать CharacterRange(A, B) и пусть D будет полученным CharSet.
Абстрактная операция CharacterRange принимает два параметра CharSet A и B и выполняет следующие действия:
Если A не содержит ровно один символ, или B не содержит ровно один символ, сгенерировать исключение SyntaxError.
Пусть a будет этим единственным символом в CharSet A.
Пусть b будет этим единственным символом CharSet B.
Пусть i будет значением кодовой единицы символа a.
Пусть j будет значением кодовой единицы символа b.
Если i > j, то сгенерировать исключение SyntaxError.
Вернуть набор, содержащий все символы с номерами от i до j включительно.
Для вычисления NonemptyClassRangesNoDash :: ClassAtom вычисляется ClassAtom, чтобы получить CharSet и вернуть этот CharSet.
Для вычисления NonemptyClassRangesNoDash :: ClassAtomNoDash NonemptyClassRangesNoDash выполняются следующие шаги:
Вычислить ClassAtomNoDash, чтобы получить CharSet A.
Вычислить NonemptyClassRangesNoDash, чтобы получить CharSet B.
Для вычисления NonemptyClassRangesNoDash :: ClassAtomNoDash-
ClassAtom ClassRanges выполняются следующие шаги:
Вычислить ClassAtomNoDash, чтобы получить CharSet A.
Вычислить ClassAtom, чтобы получить CharSet B.
Вычислить ClassRanges, чтобы получить CharSet C.
Вызвать CharacterRange(A, B) и пусть D будет полученным CharSet.
ПРИМЕЧАНИЕ 1 ClassRanges может быть разложен на одиночные ClassAtoms и/или диапазоны из двух ClassAtoms, разделённых тире. В последнем случае ClassRanges включают все символы между первым ClassAtom и вторым ClassAtom, включительно. Если ClassAtom не является одиночным символом (например, если он представляет собой \w
), или если кодовое значение первого ClassAtom больше, чем кодовое значение второго ClassAtom, это является ошибкой.
ПРИМЕЧАНИЕ 2 Даже если шаблон не чувствителен к регистру, важен регистр двух концов диапазона, чтобы определить, какие символы входят в этот диапазон. Например, шаблон /[E-F]/i
совпадает только с буквами E
, F
, e
и f
. А вот шаблон /[E-f]/i
совпадает со всеми буквами стандарта ASCII в верхнем и в нижнем регистре, а также с символами [
, \
, ]
, ^
, _
и `
.
ПРИМЕЧАНИЕ 3 Символ -
может интерпретироваться буквально, либо же он может означать диапазон. Он интерпретируется буквально, если он является первым или последним символом ClassRanges, начальным или конечным ограничителем диапазона, или следует сразу же описанием диапазона.
Для вычисления ClassAtom :: -
возвращается CharSet, содержащий один символ -
.
Для вычисления ClassAtom :: ClassAtomNoDash вычисляется ClassAtomNoDash, чтобы получить CharSet и вернуть этот CharSet.
Для вычисления ClassAtomNoDash :: SourceCharacter но не один из \
или ]
или -
возвращается одноэлементный CharSet, содержащий символ, представленный посредством SourceCharacter.
Для вычисления ClassAtomNoDash :: \
ClassEscape вычисляется ClassEscape, чтобы получить CharSet и вернуть этот CharSet.
Для вычисления ClassEscape :: DecimalEscape выполняются следующие шаги:
Вычислить DecimalEscape для получения EscapeValue E.
Если E не является символом, сгенерировать исключение SyntaxError.
Пусть ch будет символом для E.
Вернуть одноэлементный CharSet, содержащий символ ch.
Для вычисления ClassEscape :: b
возвращается CharSet, содержащий один символ <BS> (значение Юникода 0008).
Для вычисления ClassEscape :: CharacterEscape вычислить CharacterEscape, чтобы получить символ и вернуть одноэлементный CharSet, содержащий этот символ.
Для вычисления ClassEscape :: CharacterClassEscape вычисляется CharacterClassEscape, чтобы получить CharSet и вернуть этот CharSet.
ПРИМЕЧАНИЕ ClassAtom может использовать любую управляющую последовательность, разрешённую в оставшейся части регулярного выражения, кроме \b
, \B
и обратных ссылок. Внутри CharacterClass \b
означает символ возврата на одну позицию, а \B
и обратные ссылки генерируют ошибки. Использование обратной ссылки внутри ClassAtom генерирует ошибку.
Если pattern представляет собой объект R, у которого внутреннее свойство [[Class]] равно "RegExp"
, а flags равно undefined, вернуть R без изменений. В противном случае вызвать стандартный встроенный конструктор RegExp
(15.10.4.1), как если бы он был создан выражением new RegExp(
pattern,
flags)
и вернуть объект, созданный этим конструктором.
Если RegExp
вызывается как часть выражения new
, он является конструктором, так как он инициализирует созданный объект.
Если pattern представляет собой объект R, у которого внутреннее свойства [[Class]] равно "RegExp"
, а flags равно undefined, пусть P будет pattern, используемым для создания R, и пусть F будет flags, используемым для создания R. Если pattern представляет собой объект R, у которого внутреннее свойство [[Class]] равно "RegExp"
, а flags не равно undefined, сгенерировать исключение TypeError. Иначе, пусть P будет пустой строкой, если pattern равно undefined, а в противном случае будет равно ToString(pattern), и пусть F будет пустой строкой, если flags равно undefined, а в противном случае будет равно ToString(flags).
Если символы из P не имеют синтаксической формы Pattern, сгенерировать исключение SyntaxError. В противном случае, пусть у создаваемого объекта будет внутреннее свойство [[Match]], полученное в результате вычисления ("компилирования") символов для P в качестве Pattern, как описано в пункте 15.10.2.
Если F содержит символ, отличный от символов "g"
, "i"
или "m"
, или если он содержит один и тот же символ более одного раза, сгенерировать исключение SyntaxError.
Если исключение SyntaxError не сгенерировано, то:
Пусть S будет строкой в формате Pattern, эквивалентом P, в котором определённые символы отключаются, как описано далее. S может быть идентичным P или pattern, или нет; однако, внутренняя процедура, полученная в результате вычисления S в качестве Pattern, должна вести себя так же, как и внутренняя процедура, предоставленная внутренним свойством [[Match]] создаваемого объекта.
Символы /
или обратная косая черта \
, встречающиеся в шаблоне, в строке S должны отключаться, если это необходимо для того, чтобы строковое значение, полученное в результате конкатенации строк "/"
, S, "/"
и F, могли быть подвергнуты синтаксическому разбору (в соответствующем лексическом контексте) как RegularExpressionLiteral, который ведёт себя аналогично создаваемому регулярному выражению. Например, если P равно "/"
, то S, среди прочих возможных вариантов, могло бы быть "\/"
или "\u002F"
, но не "/"
, потому что в результате синтаксического разбора ///
с последующим F передавалось бы как SingleLineComment, а не как RegularExpressionLiteral. Если P – пустая строка, то этой спецификации можно соответствовать, если S будет "(?:)"
.
Следующие свойства создаваемого объекта являются свойствами данных с атрибутами, указанными в пункте 15.10.7. [[Value]] каждого свойства задаётся следующим образом:
Свойству source
создаваемого объекта присваивается значение S.
Свойству global
создаваемого объекта присваивается булево значение, равное true, если F содержит символ "
g
"
, а в противном случае – равное false.
Свойству ignoreCase
создаваемого объекта присваивается булево значение, равное true, если F содержит символ "
g
"
, а в противном случае – равное false.
Свойству multiline
создаваемого объекта присваивается булево значение, равное true, если F содержит символ "
g
"
, а в противном случае – равное false.
Свойству multiline
создаваемого объекта присваивается значение 0.
Внутреннее свойство [[Prototype]] создаваемого объекта устанавливается равным стандартному встроенному объекту-прототипу RegExp, как указано в пункте 15.10.6.
Внутреннее свойство [[Class]] создаваемого объекта устанавливается равным "RegExp"
.
ПРИМЕЧАНИЕ Если строка представляет собой StringLiteral, то прежде чем производить обработку строки регулярным выражением, производятся обычные замены управляющей последовательности. Если шаблон содержит управляющую последовательно, распознаваемую регулярным выражением, то символы обратной косой черты \
внутри StringLiteral должны отключаться, чтобы они не удалялись при формировании содержимого StringLiteral.
Значением внутреннего свойства [[Prototype]] конструктора RegExp является стандартный встроенный объект-прототип Function (15.3.4).
Кроме внутренних свойств и свойства length
со значением 2, конструктор RegExp имеет следующие свойства:
Начальным значением RegExp.prototype
является объект-прототип RegExp (15.10.6).
Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
Значением внутреннего свойства [[Prototype]] объекта-прототипа RegExp является стандартный встроенный объект-прототип Object (15.2.4). Объект-прототип RegExp сам по себе является объектом регулярного выражения. Его [[Class]] равен "
RegExp
"
. Начальные значения свойств данных объекта-прототипа RegExp (15.10.7) устанавливаются такими, как если бы этот объект был создан выражением new RegExp()
, где RegExp
является этим стандартным встроенным конструктором с этим именем.
Объект-прототип RegExp не имеет собственного свойства valueOf
, но он наследует свойство valueOf
от объекта-прототипа Object.
В приведённых ниже описаниях функций, которые являются свойствами объекта-прототипа RegExp, фраза "объект this типа RegExp" означает объект, который представляет собой значение this, переданное при вызове функции. Если значение this не является объектом, или является объектом, для которого значение внутреннего свойства [[Class]] не равно "RegExp"
, генерируется исключение TypeError.
Начальным значением RegExp.prototype.constructor
является стандартный встроенный конструктор RegExp
.
Производит поиск соответствия регулярному выражению в строке string и возвращает объект Array, содержащий результаты соответствия, или null, если соответствие не найдено.
Поиск по строке ToString(string) экземпляров шаблона регулярного выражения производится следующим образом:
Пусть R будет объектом this типа RegExp.
Пусть S будет значением ToString(string).
Пусть length будет длиной для S.
Пусть lastIndex будет результатом вызова внутреннего метода [[Get]] для R с аргументом "lastIndex"
.
Пусть i будет значением ToInteger(lastIndex).
Пусть global будет результатом вызова внутреннего метода [[Get]] для R с аргументом "global"
.
Если global равно false, пусть i = 0.
Пусть matchSucceeded будет false.
Повторять, пока matchSucceeded равно false.
Если i < 0 или i > length, то
Вызвать внутренний метод [[Put]] для R с аргументами "lastIndex
"
, 0 и true.
Вернуть null
.
Вызвать внутренний метод [[Match]] для R с аргументами S и i.
Если [[Match]] вернол failure, то
Пусть i = i+1.
else
Пусть r будет результатом State для вызова [[Match]].
Присвоить matchSucceeded значение true.
Пусть e будет значением endIndex для r.
Если global равно true,
Вызвать внутренний метод [[Put]] для R с аргументами "lastIndex
"
, e, и true.
Пусть n будет длиной массива captures для r. (Это точно такое же значение, что и значение NCapturingParens из пункта 15.10.2.1).
Пусть A будет новым массивом, как если бы он был создан выражением new Array()
, где Array
является стандартным встроенным конструктором с этим именем.
Пусть matchIndex будет позицией совпавшей подстроки в целой строке S.
Вызвать внутренний метод [[DefineOwnProperty]] для A с аргументами "index
"
, Property Descriptor {[[Value]]: matchIndex, [[Writable]: true, [[Enumerable]]: true, [[Configurable]]: true} и true.
Вызвать внутренний метод [[DefineOwnProperty]] для A с аргументами "input
"
, Property Descriptor {[[Value]]: S, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} и true.
Вызвать внутренний метод [[DefineOwnProperty]] для A с аргументами "length
"
, Property Descriptor {[[Value]]: n + 1} и true.
Пусть matchedSubstr будет совпавшей подстрокой (то есть, частью строки S между смещением i включительтно и смещением e не включительно).
Вызвать внутренний метод [[DefineOwnProperty]] для A с аргументами "
0
", Property Descriptor {[[Value]]: matchedSubstr, [[Writable]: true, [[Enumerable]]: true, [[Configurable]]: true} и true.
Для каждого такого целого числа i , чтобы I > 0 и I ≤ n
Пусть captureI будет элементом № i массива captures для r.
Вызвать внутренний метод [[DefineOwnProperty]] для A с аргументами ToString(i), Property Descriptor {[[Value]]: captureI, [[Writable]: true, [[Enumerable]]: true, [[Configurable]]: true} и true.
Вернуть А.
Выполняются следующие шаги:
Пусть match будет результатом вычисления алгоритма RegExp.prototype.exec
(15.10.6.2) над объектом this типа RegExp, с использованием string в качестве аргумента.
Если match не равно null, вернуть true; иначе вернуть false.
Возвращает строковое значение, полученное в результате конкатенации строк "
/
"
, строкового значения свойства source объекта this типа RegExp, и "
/
"
; а также "
g
"
, если свойство global
равно true, "
i
"
, если свойства ignoreCase
равно true, и "
m
"
, если свойство multiline
равно true.
ПРИМЕЧАНИЕ Возвращаемая строка имеет формат RegularExpressionLiteral, который преобразуется в другой объект типа RegExp с таким же поведением, что и объект this.
Экземпляры RegExp наследуют свойства объекта-прототипа RegExp. Значение их внутреннего свойства [[Class]] равно "RegExp"
. Экземпляры RegExp также имеют внутреннее свойство [[Match]] и свойство length
.
Значение внутреннего свойства [[Match]] представляет собой зависящее от реализации представление шаблона Pattern объекта типа RegExp.
Кроме того, экземпляры RegExp обладают следующими свойствами:
Значение свойства source
представляет собой строку в формате Pattern, представляющую текущее регулярное выражение. Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
Значение свойства global
представляет собой булево значение, указывающее, содержат ли флаги символ “g”
. Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
Значение свойства ignoreCase
представляет собой булево значение, указывающее, содержат ли флаги символ “i”
. Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
Значение свойства multiline
представляет собой булево значение, указывающее, содержат ли флаги символ “m”
. Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
Значение свойства lastIndex
указывает на позицию в строке, с которой начинается следующий поиск совпадения. При использовании оно приводится к целому числу (см. 15.10.6.2). Это свойство имеет атрибуты { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }.
ПРИМЕЧАНИЕ В отличие от других стандартных встроенных свойства экземпляров RegExp, lastIndex
является перезаписываемым свойством.