ECMAScript | Атом (Atom) | Регулярные выражения (Regular Expression)

ECMAScript | Атом (Atom) | Регулярные выражения (Regular Expression)

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

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

1. Пусть ch будет символом, совпадающим с PatternCharacter.
2. Пусть A будет одно-элементным CharSet, содержащим символ ch.
3. Вернуть ! CharacterSetMatcher(A, false, direction).

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

1. Пусть A будет CharSet всех символов.
2. Если DotAll не является true, тогда
   а. Удалите из A все символы, соответствующие кодовой точке в правой части производства LineTerminator.
3. Вернуть ! CharacterSetMatcher(A, false, direction).

 

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

1. Вернуть Сопоставитель Matcher, который является результатом вычисления AtomEscape с аргументом direction.

 

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

1. Оцените CharacterClass, чтобы получить CharSet A и логическое инвертирование invert.
2. Вернуть ! CharacterSetMatcher(A, invert, direction).

 

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

1. Оцените Дизъюнкцию (Disjunction) с аргументом direction, чтобы получить Сопоставитель Matcher m.
2. Пусть parenIndex будет числом скобок с левым захватом во всем регулярном выражении, которое встречается слева от этого Атома Atom. Это общее количество узлов синтаксического анализа Атома Atom :: ( GroupSpecifier Disjunction ), предшествующих или включающих этот Атом Atom.
3. Верните новый Сопоставитель Matcher с параметрами (x, c), который фиксирует направление direction, m и parenIndex и при вызове выполняет следующие шаги:
   а. Утверждено: x - это Состояние (State).
   b. Утверждено: c - это Продолжение (Continuation).
   c. Пусть d будет новым Продолжением с параметрами (y), которое захватывает x, c, direction и parenIndex и при вызове выполняет следующие шаги:
      i. Утверждено: y - это Состояние (State).
      ii. Пусть cap будет копией Списка y из captures.
      iii. Пусть xe будет endIndex для x.
      iv. Пусть ye будет endIndex из у.
      v. Если direction = 1, тогда
         1. Утверждено: xeye.
         2. Пусть s будет Списком, элементы которого являются символами Input с индексами от xe (включительно) до ye (исключая).
      vi. Иначе,
         1. Утверждено: направление direction равен -1.
         2. Утверждено: yexe.
         3. Пусть s будет Списком, элементы которого являются символами Input с индексами от ye (включительно) до xe (исключая).
      vii. Установите cap[parenIndex + 1] в s.
      viii. Пусть z будет Состоянием (ye, cap).
      ix. Верните c(z).
   d. Верните m(x, d).

 

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

1. Верните Сопоставитель Matcher, который является результатом оценки Дизъюнкции Disjunction с аргументом direction.

 

22.2.2.8.1 CharacterSetMatcher ( A, invert, direction )
22.2.2.8.2 Canonicalize ( ch )
22.2.2.8.3 UnicodeMatchProperty ( p )
22.2.2.8.4 UnicodeMatchPropertyValue ( p, v )

 

CharacterSetMatcher ( A, invert, direction )

Абстрактная операция CharacterSetMatcher (Сопоставитель набора символов) принимает аргументы A (CharSet), invert (логическое значение) и направление direction (1 или -1). При вызове он выполняет следующие шаги:

1. Вернуть новый Сопоставитель Matcher с параметрами (x, c), который фиксирует A, invert и direction и при вызове выполняет следующие шаги:
   а. Утверждено: x - это Состояние (State).
   b. Утверждено: c - это Продолжение (Continuation).
   c. Пусть e будет endIndex для x.
   d. Пусть f - это e + direction.
   е. Если f < 0 или f > InputLength, вернуть ошибку failure.
   f. Пусть index равен min(e, f).
   g. Пусть ch будет символом Input[index].
   h. Пусть cc будет Canonicalize(ch).
   i. Если существует такой член a класса A, что Canonicalize(a) имеет значение cc, пусть найденное found будет true (истина). В противном случае пусть найденный found будет false (ложным).
   j. Если invert является false (ложно), а found - false, вернуть ошибку failure.
   k. Если invert является true, а found - true, вернуть ошибку failure.
   l. Пусть cap будет списком захвата captures для x.
   m. Пусть y будет состоянием (f, cap).
   n. Вернуть c(y).

 

Canonicalize ( ch )

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

1. Если Unicode является true и IgnoreCase является true, тогда
   а. Если файл CaseFolding.txt базы данных символов Unicode предоставляет простое или обычное отображение сворачивания регистра для ch, верните результат применения этого отображения к ch.
   b. Вернуть ch.
2. Если IgnoreCase является false, вернуть ch.
3. Утверждено: ch - это кодовая единица UTF-16.
4. Пусть cp будет кодовой точкой, числовое значение которой совпадает с ch.
5. Пусть u будет результатом toUppercase («cp») в соответствии с алгоритмом преобразования регистра Unicode по умолчанию.
6. Пусть uStr будет ! CodePointsToString(u).
7. Если uStr не состоит из единственной кодовой единицы, вернуть ch.
8. Пусть cu будет единичным элементом кода uStr.
9. Если числовое значение ch ≥ 128 и числовое значение cu <128, вернуть ch.
10. Вернуть cu.

 

Примечание 1

Скобки формы ( Disjunction ) служат как для группировки компонентов шаблона Дизъюнкции Disjunction, так и для сохранения результата сопоставления. Результат может быть использован либо в обратной ссылке (\, за которой следует ненулевое десятичное число), на него можно ссылаться в строке замены, либо он может быть возвращен как часть массива из регулярного выражения, соответствующего Abstract Closure. Чтобы запретить захват скобок, используйте вместо этого форму ( ? : 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"]

 

Примечание 4

В совпадениях без учета регистра, когда Unicode имеет значение true, все символы неявно свертываются по регистру с использованием простого сопоставления, обеспечиваемого стандартом Unicode, непосредственно перед их сравнением. Простое отображение всегда отображается в одну кодовую точку, поэтому оно не отображает, например, ß (U+00DF) в SS. Однако он может отображать кодовую точку вне диапазона Basic Latin в символ внутри, например, ſ (U+017F) в s. Такие символы не отображаются, если Unicode имеет значение false. Это предотвращает совпадение кодовых точек Unicode, таких как U+017F и U+212A, с регулярными выражениями, такими как /[a-z]/i, но они будут соответствовать /[a-z]/ui.

 

UnicodeMatchProperty ( p )

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

1. Утверждено: p - это Список кодовых точек Unicode, который идентичен Списку кодовых точек Unicode, который является именем свойства Unicode или псевдонимом свойства, перечисленным в столбце «Имя свойства и псевдонимы» (Property name and aliases) Таблицы 60 или Таблицы 61.
2. Пусть c будет каноническим именем свойства p, указанным в столбце «Каноническое имя свойства» (Canonical property name) соответствующей строки.
3. Верните Список кодовых точек Unicode c.

Реализации должны поддерживать имена и псевдонимы свойств Unicode, перечисленные в Таблице 60 и Таблице 61. Для обеспечения взаимодействия реализации не должны поддерживать какие-либо другие имена или псевдонимы свойств.

Примечание 1

Например, Script_Extensions (имя свойства) и scx (псевдоним свойства) допустимы, а script_extensions или Scx — нет.

 

Примечание 2

Перечисленные свойства являются расширенным набором того, что требуется для UTS18 RL1.2.

 

Название и псевдонимы свойства Каноническое имя свойства
General_Category General_Category
gc
Script Script
sc
Script_Extensions Script_Extensions
scx

Таблица 60: Псевдонимы небинарных свойств Unicode и их канонические имена свойств

 

Таблица 61: Псевдонимы свойств двоичного Unicode и их канонические имена свойств
Property name and aliases Canonical property name
ASCII ASCII
ASCII_Hex_Digit ASCII_Hex_Digit
AHex
Alphabetic Alphabetic
Alpha
Any Any
Assigned Assigned
Bidi_Control Bidi_Control
Bidi_C
Bidi_Mirrored Bidi_Mirrored
Bidi_M
Case_Ignorable Case_Ignorable
CI
Cased Cased
Changes_When_Casefolded Changes_When_Casefolded
CWCF
Changes_When_Casemapped Changes_When_Casemapped
CWCM
Changes_When_Lowercased Changes_When_Lowercased
CWL
Changes_When_NFKC_Casefolded Changes_When_NFKC_Casefolded
CWKCF
Changes_When_Titlecased Changes_When_Titlecased
CWT
Changes_When_Uppercased Changes_When_Uppercased
CWU
Dash Dash
Default_Ignorable_Code_Point Default_Ignorable_Code_Point
DI
Deprecated Deprecated
Dep
Diacritic Diacritic
Dia
Emoji Emoji
Emoji_Component Emoji_Component
EComp
Emoji_Modifier Emoji_Modifier
EMod
Emoji_Modifier_Base Emoji_Modifier_Base
EBase
Emoji_Presentation Emoji_Presentation
EPres
Extended_Pictographic Extended_Pictographic
ExtPict
Extender Extender
Ext
Grapheme_Base Grapheme_Base
Gr_Base
Grapheme_Extend Grapheme_Extend
Gr_Ext
Hex_Digit Hex_Digit
Hex
IDS_Binary_Operator IDS_Binary_Operator
IDSB
IDS_Trinary_Operator IDS_Trinary_Operator
IDST
ID_Continue ID_Continue
IDC
ID_Start ID_Start
IDS
Ideographic Ideographic
Ideo
Join_Control Join_Control
Join_C
Logical_Order_Exception Logical_Order_Exception
LOE
Lowercase Lowercase
Lower
Math Math
Noncharacter_Code_Point Noncharacter_Code_Point
NChar
Pattern_Syntax Pattern_Syntax
Pat_Syn
Pattern_White_Space Pattern_White_Space
Pat_WS
Quotation_Mark Quotation_Mark
QMark
Radical Radical
Regional_Indicator Regional_Indicator
RI
Sentence_Terminal Sentence_Terminal
STerm
Soft_Dotted Soft_Dotted
SD
Terminal_Punctuation Terminal_Punctuation
Term
Unified_Ideograph Unified_Ideograph
UIdeo
Uppercase Uppercase
Upper
Variation_Selector Variation_Selector
VS
White_Space White_Space
space
XID_Continue XID_Continue
XIDC
XID_Start XID_Start
XIDS

 

UnicodeMatchPropertyValue ( p, v )

Абстрактная операция UnicodeMatchPropertyValue (Значение свойства соответствия Unicode) принимает аргументы p (список кодовых точек Unicode) и v (список кодовых точек Unicode). При вызове она выполняет следующие шаги:

1. Утверждено: p - это Список кодовых точек Unicode, который идентичен Списку кодовых точек Unicode, который представляет собой каноническое имя свойства Unicode без псевдонима, указанное в столбце «Каноническое имя свойства» таблицы 60.
2. Утверждено: v - это Список кодовых точек Unicode, который идентичен Списку кодовых точек Unicode, который является значением свойства или псевдонимом значения свойства для свойства Unicode p, указанного в столбце «Значение свойства и псевдонимы» Таблицы 62 или Таблицы 63.
3. Пусть value будет каноническим значением свойства v, указанным в столбце «Значение канонического свойства» соответствующей строки.
4. Верните Список кодовых точек Unicode из value.

Реализации должны поддерживать имена и псевдонимы значений свойств Unicode, перечисленные в Таблице 62 и Таблице 63. Для обеспечения взаимодействия реализации не должны поддерживать какие-либо другие имена или псевдонимы значений свойств.

Примечание 1

Например, Xpeo и Old_Persian являются допустимыми значениями Script_Extensions, а xpeo и Old Persian — нет.

 

Примечание 2

Этот алгоритм отличается от правил сопоставления для символьных значений, перечисленных в UAX44: регистр, пробел, U+002D (ДЕФИС-МИНУС) и U+005F (НИЗКАЯ СТРОКА) не игнорируются, а префикс Is не поддерживается.

 

Таблица 62: Псевдонимы значений и канонические значения для свойства General_Category
Property value and aliases Canonical property value
Cased_Letter Cased_Letter
LC
Close_Punctuation Close_Punctuation
Pe
Connector_Punctuation Connector_Punctuation
Pc
Control Control
Cc
cntrl
Currency_Symbol Currency_Symbol
Sc
Dash_Punctuation Dash_Punctuation
Pd
Decimal_Number Decimal_Number
Nd
digit
Enclosing_Mark Enclosing_Mark
Me
Final_Punctuation Final_Punctuation
Pf
Format Format
Cf
Initial_Punctuation Initial_Punctuation
Pi
Letter Letter
L
Letter_Number Letter_Number
Nl
Line_Separator Line_Separator
Zl
Lowercase_Letter Lowercase_Letter
Ll
Mark Mark
M
Combining_Mark
Math_Symbol Math_Symbol
Sm
Modifier_Letter Modifier_Letter
Lm
Modifier_Symbol Modifier_Symbol
Sk
Nonspacing_Mark Nonspacing_Mark
Mn
Number Number
N
Open_Punctuation Open_Punctuation
Ps
Other Other
C
Other_Letter Other_Letter
Lo
Other_Number Other_Number
No
Other_Punctuation Other_Punctuation
Po
Other_Symbol Other_Symbol
So
Paragraph_Separator Paragraph_Separator
Zp
Private_Use Private_Use
Co
Punctuation Punctuation
P
punct
Separator Separator
Z
Space_Separator Space_Separator
Zs
Spacing_Mark Spacing_Mark
Mc
Surrogate Surrogate
Cs
Symbol Symbol
S
Titlecase_Letter Titlecase_Letter
Lt
Unassigned Unassigned
Cn
Uppercase_Letter Uppercase_Letter
Lu

 

Таблица 63: Псевдонимы значений и канонические значения для свойств Unicode Script и Script_Extensions
Property value and aliases Canonical property value
Adlam Adlam
Adlm
Ahom Ahom
Anatolian_Hieroglyphs Anatolian_Hieroglyphs
Hluw
Arabic Arabic
Arab
Armenian Armenian
Armn
Avestan Avestan
Avst
Balinese Balinese
Bali
Bamum Bamum
Bamu
Bassa_Vah Bassa_Vah
Bass
Batak Batak
Batk
Bengali Bengali
Beng
Bhaiksuki Bhaiksuki
Bhks
Bopomofo Bopomofo
Bopo
Brahmi Brahmi
Brah
Braille Braille
Brai
Buginese Buginese
Bugi
Buhid Buhid
Buhd
Canadian_Aboriginal Canadian_Aboriginal
Cans
Carian Carian
Cari
Caucasian_Albanian Caucasian_Albanian
Aghb
Chakma Chakma
Cakm
Cham Cham
Chorasmian Chorasmian
Chrs
Cherokee Cherokee
Cher
Common Common
Zyyy
Coptic Coptic
Copt
Qaac
Cuneiform Cuneiform
Xsux
Cypriot Cypriot
Cprt
Cyrillic Cyrillic
Cyrl
Deseret Deseret
Dsrt
Devanagari Devanagari
Deva
Dives_Akuru Dives_Akuru
Diak
Dogra Dogra
Dogr
Duployan Duployan
Dupl
Egyptian_Hieroglyphs Egyptian_Hieroglyphs
Egyp
Elbasan Elbasan
Elba
Elymaic Elymaic
Elym
Ethiopic Ethiopic
Ethi
Georgian Georgian
Geor
Glagolitic Glagolitic
Glag
Gothic Gothic
Goth
Grantha Grantha
Gran
Greek Greek
Grek
Gujarati Gujarati
Gujr
Gunjala_Gondi Gunjala_Gondi
Gong
Gurmukhi Gurmukhi
Guru
Han Han
Hani
Hangul Hangul
Hang
Hanifi_Rohingya Hanifi_Rohingya
Rohg
Hanunoo Hanunoo
Hano
Hatran Hatran
Hatr
Hebrew Hebrew
Hebr
Hiragana Hiragana
Hira
Imperial_Aramaic Imperial_Aramaic
Armi
Inherited Inherited
Zinh
Qaai
Inscriptional_Pahlavi Inscriptional_Pahlavi
Phli
Inscriptional_Parthian Inscriptional_Parthian
Prti
Javanese Javanese
Java
Kaithi Kaithi
Kthi
Kannada Kannada
Knda
Katakana Katakana
Kana
Kayah_Li Kayah_Li
Kali
Kharoshthi Kharoshthi
Khar
Khitan_Small_Script Khitan_Small_Script
Kits
Khmer Khmer
Khmr
Khojki Khojki
Khoj
Khudawadi Khudawadi
Sind
Lao Lao
Laoo
Latin Latin
Latn
Lepcha Lepcha
Lepc
Limbu Limbu
Limb
Linear_A Linear_A
Lina
Linear_B Linear_B
Linb
Lisu Lisu
Lycian Lycian
Lyci
Lydian Lydian
Lydi
Mahajani Mahajani
Mahj
Makasar Makasar
Maka
Malayalam Malayalam
Mlym
Mandaic Mandaic
Mand
Manichaean Manichaean
Mani
Marchen Marchen
Marc
Medefaidrin Medefaidrin
Medf
Masaram_Gondi Masaram_Gondi
Gonm
Meetei_Mayek Meetei_Mayek
Mtei
Mende_Kikakui Mende_Kikakui
Mend
Meroitic_Cursive Meroitic_Cursive
Merc
Meroitic_Hieroglyphs Meroitic_Hieroglyphs
Mero
Miao Miao
Plrd
Modi Modi
Mongolian Mongolian
Mong
Mro Mro
Mroo
Multani Multani
Mult
Myanmar Myanmar
Mymr
Nabataean Nabataean
Nbat
Nandinagari Nandinagari
Nand
New_Tai_Lue New_Tai_Lue
Talu
Newa Newa
Nko Nko
Nkoo
Nushu Nushu
Nshu
Nyiakeng_Puachue_Hmong Nyiakeng_Puachue_Hmong
Hmnp
Ogham Ogham
Ogam
Ol_Chiki Ol_Chiki
Olck
Old_Hungarian Old_Hungarian
Hung
Old_Italic Old_Italic
Ital
Old_North_Arabian Old_North_Arabian
Narb
Old_Permic Old_Permic
Perm
Old_Persian Old_Persian
Xpeo
Old_Sogdian Old_Sogdian
Sogo
Old_South_Arabian Old_South_Arabian
Sarb
Old_Turkic Old_Turkic
Orkh
Oriya Oriya
Orya
Osage Osage
Osge
Osmanya Osmanya
Osma
Pahawh_Hmong Pahawh_Hmong
Hmng
Palmyrene Palmyrene
Palm
Pau_Cin_Hau Pau_Cin_Hau
Pauc
Phags_Pa Phags_Pa
Phag
Phoenician Phoenician
Phnx
Psalter_Pahlavi Psalter_Pahlavi
Phlp
Rejang Rejang
Rjng
Runic Runic
Runr
Samaritan Samaritan
Samr
Saurashtra Saurashtra
Saur
Sharada Sharada
Shrd
Shavian Shavian
Shaw
Siddham Siddham
Sidd
SignWriting SignWriting
Sgnw
Sinhala Sinhala
Sinh
Sogdian Sogdian
Sogd
Sora_Sompeng Sora_Sompeng
Sora
Soyombo Soyombo
Soyo
Sundanese Sundanese
Sund
Syloti_Nagri Syloti_Nagri
Sylo
Syriac Syriac
Syrc
Tagalog Tagalog
Tglg
Tagbanwa Tagbanwa
Tagb
Tai_Le Tai_Le
Tale
Tai_Tham Tai_Tham
Lana
Tai_Viet Tai_Viet
Tavt
Takri Takri
Takr
Tamil Tamil
Taml
Tangut Tangut
Tang
Telugu Telugu
Telu
Thaana Thaana
Thaa
Thai Thai
Tibetan Tibetan
Tibt
Tifinagh Tifinagh
Tfng
Tirhuta Tirhuta
Tirh
Ugaritic Ugaritic
Ugar
Vai Vai
Vaii
Wancho Wancho
Wcho
Warang_Citi Warang_Citi
Wara
Yezidi Yezidi
Yezi
Yi Yi
Yiii
Zanabazar_Square Zanabazar_Square
Zanb

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

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