├── .gitignore
├── LICENSE
├── src
├── Languages
│ └── Русский.xml
├── Subsystems
│ └── Регулярка.xml
├── CommonModules
│ ├── Регулярка.xml
│ ├── РегуляркаПовтИсп.xml
│ ├── РегуляркаПовтИсп
│ │ └── Ext
│ │ │ └── Module.bsl
│ └── Регулярка
│ │ └── Ext
│ │ └── Module.bsl
└── Configuration.xml
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | src/ConfigDumpInfo.xml
2 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 Andrew Bryzgalin
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/src/Languages/Русский.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Русский
6 |
7 |
8 | ru
9 | Русский
10 |
11 |
12 |
13 | ru
14 |
15 |
16 |
--------------------------------------------------------------------------------
/src/Subsystems/Регулярка.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Регулярка
6 |
7 |
8 | ru
9 | Регулярные выражения
10 |
11 |
12 |
13 | true
14 | true
15 |
16 |
17 |
18 | CommonModule.Регулярка
19 | CommonModule.РегуляркаПовтИсп
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/src/CommonModules/Регулярка.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Регулярка
6 |
7 |
8 | ru
9 | Регулярные выражения (клиент, сервер)
10 |
11 |
12 |
13 | false
14 | true
15 | true
16 | true
17 | false
18 | false
19 | false
20 | DontUse
21 |
22 |
23 |
--------------------------------------------------------------------------------
/src/CommonModules/РегуляркаПовтИсп.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | РегуляркаПовтИсп
6 |
7 |
8 | ru
9 | Регулярные выражения (повторное использование)
10 |
11 |
12 |
13 | false
14 | true
15 | true
16 | true
17 | false
18 | false
19 | false
20 | DuringSession
21 |
22 |
23 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Подсистема "Регулярка"
2 |
3 | Работа с регулярными выражениями средствами платформы 1С:Предриятие
4 |
5 | Доступный функционал:
6 | - построение процессора регулярного выражения по шаблону
7 | - проверка полного соответствия текста регулярному выражению
8 | - поиск вхождений в тексте по регулярному выражению
9 |
10 | Реализованы следующие элементы построения регулярных выражений:
11 | - операции: `|`, `()`
12 | - квантификаторы: `*`, `+`, `?`, `{n}`, `{, n}`, `{n, }`, `{n, m}`
13 | - символы: `.`, `\`, `\t`, `\n`, `\r`, `\f`, `\a`, `\e`, `\xhh`, `\uhhhh`
14 | - классы символов: `[abc]`, `[^x-z]`
15 | - предопределённые классы символов: `\d`, `\D`, `\h`, `\H`, `\s`, `\S`, `\v`, `\V`, `\w`, `\W`
16 |
17 | Подсистема обходится исключительно средствами платформы 1С. Отрабатывает на клиенте и сервере.
18 |
19 | В основе движка подсистемы недетерминированный конечный автомат. [PDF презентации](https://sedgewick.io/wp-content/uploads/2022/04/Algs20-RegularExpressions.pdf) по материалам книги Роберта Сэджвика и Кевина Уэйна.
20 |
21 | Разрабатывается на платформах 8.3.21.1302 и 8.3.10.2667
22 |
23 | Требуемая минимальная версия: 8.3.6
24 |
25 | Требуемая минимальная версия расширения: 8.3.9
26 |
27 | Ограничения платформы можно существенно снизить вплоть до 8.1, избавившись от типов *Фиксированных* коллекций и функции `СтрСоединить`.
28 |
29 | ## Пример кода
30 |
31 | Проверка соответствия всей строки шаблону (процессор можно переиспользовать):
32 |
33 | ```bsl
34 | Шаблон = "(A*B|\d)D";
35 | Процессор = Регулярка.ПроцессорРаспознавания(Шаблон);
36 |
37 | Сообщить(Регулярка.Распознано(Процессор, "D")); // Ложь
38 | Сообщить(Регулярка.Распознано(Процессор, "3D")); // Истина
39 | Сообщить(Регулярка.Распознано(Процессор, "BD")); // Истина
40 | Сообщить(Регулярка.Распознано(Процессор, "AD")); // Ложь
41 | Сообщить(Регулярка.Распознано(Процессор, "AAAAAABD")); // Истина
42 | ```
43 |
44 | Поиск вхождений в тексте:
45 |
46 | ```bsl
47 | Процессор = Регулярка.ПроцессорРаспознавания("\n");
48 |
49 | Текст =
50 | "Белеет парус одинокой
51 | |В тумане моря голубом. —
52 | |Что ищет он в стране далекой?
53 | |Что кинул он в краю родном?";
54 |
55 | Вхождения = Регулярка.Вхождения(Процессор, Текст);
56 | ```
57 |
--------------------------------------------------------------------------------
/src/Configuration.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 9cd510cd-abfc-11d4-9434-004095e12fc7
7 | cd330ec4-142e-46d6-9244-d87a54dacb50
8 |
9 |
10 | 9fcd25a0-4822-11d4-9414-008048da11f9
11 | d02b22f7-170b-4f9b-bb04-1067ec9a7053
12 |
13 |
14 | e3687481-0a87-462c-a166-9f34594f9bba
15 | f2b7a4c6-be96-450e-9135-6ba149e4f2b7
16 |
17 |
18 | 9de14907-ec23-4a07-96f0-85521cb6b53b
19 | 7525ec42-66af-4352-b713-7e6c64d729e0
20 |
21 |
22 | 51f2d5d8-ea4d-4064-8892-82951750031e
23 | 461cd002-fbe5-4b52-9057-526719c747dc
24 |
25 |
26 | e68182ea-4237-4383-967f-90c1e3370bc7
27 | 51431a60-82df-4662-87ac-de643e3b5295
28 |
29 |
30 |
31 | Регулярка
32 |
33 |
34 | ru
35 | Регулярные выражения
36 |
37 |
38 |
39 |
40 | Version8_3_10
41 | ManagedApplication
42 |
43 | PersonalComputer
44 | MobileDevice
45 |
46 | Russian
47 |
48 | Брызгалин Андрей Васильевич (andrew.bryzgalin@gmail.com)
49 | 1.0.0
50 | https://github.com/SpaceHead1C/1c_regexp/releases
51 | false
52 | false
53 | false
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 | Multimedia
69 | false
70 |
71 |
72 | Location
73 | false
74 |
75 |
76 | Contacts
77 | false
78 |
79 |
80 | Calendars
81 | false
82 |
83 |
84 | Telephony
85 | false
86 |
87 |
88 | PushNotification
89 | false
90 |
91 |
92 | LocalNotification
93 | false
94 |
95 |
96 | Print
97 | false
98 |
99 |
100 | InAppPurchases
101 | false
102 |
103 |
104 | Ads
105 | false
106 |
107 |
108 | Normal
109 |
110 |
111 | Language.Русский
112 |
113 |
114 |
115 | ru
116 | Библиотека методов для работы с регулярными выражениями
117 |
118 |
119 |
120 |
121 | ru
122 | Copyright © Брызгалин Андрей Васильевич, 2023. Все права защищены.
123 |
124 |
125 |
126 |
127 | ru
128 | https://github.com/SpaceHead1C
129 |
130 |
131 |
132 |
133 | ru
134 | https://github.com/SpaceHead1C/1c_regexp
135 |
136 |
137 | Automatic
138 | NotAutoFree
139 | DontUse
140 | DontUse
141 | Taxi
142 | Version8_3_6
143 |
144 |
145 |
146 | Русский
147 | Регулярка
148 | Регулярка
149 | РегуляркаПовтИсп
150 |
151 |
152 |
--------------------------------------------------------------------------------
/src/CommonModules/РегуляркаПовтИсп/Ext/Module.bsl:
--------------------------------------------------------------------------------
1 |
2 | // SPDX-License-Identifier: MIT
3 |
4 | #Область СлужебныйПрограммныйИнтерфейс
5 | // Возвращает множество метасимволов
6 | //
7 | // Возвращаемое значение:
8 | // ФиксированноеСоответствие - ключи содержат метасимволы
9 | //
10 | Функция Метасимволы() Экспорт
11 | фРезультат = Новый Соответствие;
12 | Для Каждого МетаСимвол Из СтрРазделить("(,),[,],|,*,+,?", ",") Цикл
13 | фРезультат.Вставить(МетаСимвол, Истина);
14 | КонецЦикла;
15 |
16 | Возврат Новый ФиксированноеСоответствие(фРезультат);
17 | КонецФункции
18 |
19 | // Возвращает множество символов экранирования
20 | //
21 | // Возвращаемое значение:
22 | // ФиксированноеСоответствие - значения по символам экранирования
23 | //
24 | Функция ЭкранированияСимволов() Экспорт
25 | фРезультат = Новый Соответствие;
26 |
27 | Для Каждого КЗ Из РегуляркаПовтИсп.Метасимволы() Цикл
28 | фРезультат.Вставить(КЗ.Ключ, КЗ.Ключ);
29 | КонецЦикла;
30 |
31 | фРезультат.Вставить("\", "\");
32 | фРезультат.Вставить(".", ".");
33 | фРезультат.Вставить("t", Символ(9)); // Символы.Таб
34 | фРезультат.Вставить("n", Символ(10)); // Символы.ПС
35 | фРезультат.Вставить("r", Символ(13)); // Символы.ВК
36 | фРезультат.Вставить("f", Символ(12)); // Символы.ПФ
37 | фРезультат.Вставить("a", Символ(7));
38 | фРезультат.Вставить("e", Символ(27)); // backspace
39 |
40 | Возврат Новый ФиксированноеСоответствие(фРезультат);
41 | КонецФункции
42 |
43 | // Возвращает множество символов экранирования в классах символов
44 | //
45 | // Возвращаемое значение:
46 | // ФиксированноеСоответствие - значения по символам экранирования
47 | //
48 | Функция ЭкранированияСимволовВКлассе() Экспорт
49 | фРезультат = Новый Соответствие(РегуляркаПовтИсп.ЭкранированияСимволов());
50 | фРезультат.Удалить(".");
51 |
52 | Для Каждого КЗ Из РегуляркаПовтИсп.Метасимволы() Цикл
53 | фРезультат.Удалить(КЗ.Ключ);
54 | КонецЦикла;
55 |
56 | фРезультат.Вставить("-", "-");
57 | фРезультат.Вставить("[", "[");
58 | фРезультат.Вставить("]", "]");
59 |
60 | Возврат Новый ФиксированноеСоответствие(фРезультат);
61 | КонецФункции
62 |
63 | // Возвращает множество предопределённых классов символов
64 | //
65 | // Возвращаемое значение:
66 | // ФиксированноеСоответствие - классы символов по символам экранирования
67 | //
68 | Функция ПредопределенныеКлассыСимволов() Экспорт
69 | фРезультат = Новый Соответствие;
70 |
71 | фРезультат.Вставить("d", ТокеныКлассаСимволовЧисла()); // [0-9]
72 | фРезультат.Вставить("D", ТокеныКлассаСимволовЧисла(Истина)); // [^0-9]
73 | фРезультат.Вставить("h", ТокеныКлассаСимволовГоризонтальныеОтступы()); // [ \t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]
74 | фРезультат.Вставить("H", ТокеныКлассаСимволовГоризонтальныеОтступы(Истина)); // [^\h]
75 | фРезультат.Вставить("s", ТокеныКлассаПробельныхСимволов()); // [ \t\n\x0B\f\r]
76 | фРезультат.Вставить("S", ТокеныКлассаПробельныхСимволов(Истина)); // [^\s]
77 | фРезультат.Вставить("v", ТокеныКлассаСимволовВертикальныеОтступы()); // [\n\x0B\f\r\x85\u2028\u2029]
78 | фРезультат.Вставить("V", ТокеныКлассаСимволовВертикальныеОтступы(Истина)); // [^\v]
79 | фРезультат.Вставить("w", ТокеныКлассаСимволовСлов()); // [a-zA-Z_0-9]
80 | фРезультат.Вставить("W", ТокеныКлассаСимволовСлов(Истина)); // [^\w]
81 |
82 | Возврат Новый ФиксированноеСоответствие(фРезультат);
83 | КонецФункции
84 |
85 | // Возвращает имя типа токена метасимвола
86 | //
87 | // Возвращаемое значение:
88 | // Строка - имя типа
89 | //
90 | Функция ТипТокенаМетасимвол() Экспорт
91 | Возврат "Мета";
92 | КонецФункции
93 |
94 | // Возвращает имя типа токена класса символов
95 | //
96 | // Возвращаемое значение:
97 | // Строка - имя типа
98 | //
99 | Функция ТипТокенаКлассСимволов() Экспорт
100 | Возврат "Класс";
101 | КонецФункции
102 |
103 | // Возвращает соответствие цифр Hex и Dec
104 | //
105 | // Возвращаемое значение:
106 | // ФиксированноеСоответствие - соответствие цифр Hex и Dec
107 | //
108 | Функция ЗначенияЦифрHexВDec() Экспорт
109 | фРезультат = Новый Соответствие;
110 | фРезультат.Вставить("0", 0);
111 | фРезультат.Вставить("1", 1);
112 | фРезультат.Вставить("2", 2);
113 | фРезультат.Вставить("3", 3);
114 | фРезультат.Вставить("4", 4);
115 | фРезультат.Вставить("5", 5);
116 | фРезультат.Вставить("6", 6);
117 | фРезультат.Вставить("7", 7);
118 | фРезультат.Вставить("8", 8);
119 | фРезультат.Вставить("9", 9);
120 | фРезультат.Вставить("A", 10);
121 | фРезультат.Вставить("B", 11);
122 | фРезультат.Вставить("C", 12);
123 | фРезультат.Вставить("D", 13);
124 | фРезультат.Вставить("E", 14);
125 | фРезультат.Вставить("F", 15);
126 |
127 | Возврат Новый ФиксированноеСоответствие(фРезультат);
128 | КонецФункции
129 | #КонецОбласти
130 |
131 | #Область СлужебныеПроцедурыИФункции
132 | Функция ТокеныНовогоКлассаСимволов(Знач Токен)
133 | фРезультат = Новый Массив;
134 | фРезультат.Добавить(ТокенМетаСимвола("["));
135 | фРезультат.Добавить(Токен);
136 | фРезультат.Добавить(ТокенМетаСимвола("]"));
137 |
138 | Возврат фРезультат;
139 | КонецФункции
140 |
141 | Функция ТокеныКлассаСимволовСлов(Знач Отрицание = Ложь)
142 | Диапазоны = Новый Массив;
143 | ДобавитьДиапазон(Диапазоны, "a", "z"); // a-z
144 | ДобавитьДиапазон(Диапазоны, "A", "Z"); // A-Z
145 | ДобавитьДиапазон(Диапазоны, "0", "9"); // 0-9
146 |
147 | Токен = НовыйТокен(РегуляркаПовтИсп.ТипТокенаКлассСимволов(), НовыеДанныеТокенаКлассаСимволов(Отрицание));
148 | ДобавитьВТокенКлассаСимволов(Токен, "_");
149 | ДобавитьВТокенКлассаСимволов(Токен, "Диапазоны", Диапазоны);
150 |
151 | Возврат ТокеныНовогоКлассаСимволов(Токен);
152 | КонецФункции
153 |
154 | Функция ТокеныКлассаПробельныхСимволов(Знач Отрицание = Ложь)
155 | Токен = НовыйТокен(РегуляркаПовтИсп.ТипТокенаКлассСимволов(), НовыеДанныеТокенаКлассаСимволов(Отрицание));
156 | ДобавитьВТокенКлассаСимволов(Токен, " ");
157 | ДобавитьВТокенКлассаСимволов(Токен, Символ(9)); // \t
158 | ДобавитьВТокенКлассаСимволов(Токен, Символ(10)); // \n
159 | ДобавитьВТокенКлассаСимволов(Токен, Символ(11)); // \x0B
160 | ДобавитьВТокенКлассаСимволов(Токен, Символ(12)); // \f
161 | ДобавитьВТокенКлассаСимволов(Токен, Символ(13)); // \r
162 |
163 | Возврат ТокеныНовогоКлассаСимволов(Токен);
164 | КонецФункции
165 |
166 | Функция ТокеныКлассаСимволовГоризонтальныеОтступы(Знач Отрицание = Ложь)
167 | Диапазоны = Новый Массив;
168 | ДобавитьДиапазон(Диапазоны, Символ(8192), Символ(8202)); // \u2000-\u200a
169 |
170 | Токен = НовыйТокен(РегуляркаПовтИсп.ТипТокенаКлассСимволов(), НовыеДанныеТокенаКлассаСимволов(Отрицание));
171 | ДобавитьВТокенКлассаСимволов(Токен, " ");
172 | ДобавитьВТокенКлассаСимволов(Токен, Символ(9)); // \t
173 | ДобавитьВТокенКлассаСимволов(Токен, Символ(160)); // \xA0
174 | ДобавитьВТокенКлассаСимволов(Токен, Символ(5760)); // \u1680
175 | ДобавитьВТокенКлассаСимволов(Токен, Символ(6158)); // \u180e
176 | ДобавитьВТокенКлассаСимволов(Токен, Символ(8239)); // \u202f
177 | ДобавитьВТокенКлассаСимволов(Токен, Символ(8287)); // \u205f
178 | ДобавитьВТокенКлассаСимволов(Токен, Символ(12288)); // \u3000
179 | ДобавитьВТокенКлассаСимволов(Токен, "Диапазоны", Диапазоны);
180 |
181 | Возврат ТокеныНовогоКлассаСимволов(Токен);
182 | КонецФункции
183 |
184 | Функция ТокеныКлассаСимволовВертикальныеОтступы(Знач Отрицание = Ложь)
185 | Токен = НовыйТокен(РегуляркаПовтИсп.ТипТокенаКлассСимволов(), НовыеДанныеТокенаКлассаСимволов(Отрицание));
186 | ДобавитьВТокенКлассаСимволов(Токен, Символ(10)); // \n
187 | ДобавитьВТокенКлассаСимволов(Токен, Символ(11)); // \x0B
188 | ДобавитьВТокенКлассаСимволов(Токен, Символ(12)); // \f
189 | ДобавитьВТокенКлассаСимволов(Токен, Символ(13)); // \r
190 | ДобавитьВТокенКлассаСимволов(Токен, Символ(133)); // \x85
191 | ДобавитьВТокенКлассаСимволов(Токен, Символ(8232)); // \u2028
192 | ДобавитьВТокенКлассаСимволов(Токен, Символ(8233)); // \u2029
193 |
194 | Возврат ТокеныНовогоКлассаСимволов(Токен);
195 | КонецФункции
196 |
197 | Функция ТокеныКлассаСимволовЧисла(Знач Отрицание = Ложь)
198 | Диапазоны = Новый Массив;
199 | ДобавитьДиапазон(Диапазоны, "0", "9");
200 |
201 | Токен = НовыйТокен(РегуляркаПовтИсп.ТипТокенаКлассСимволов(), НовыеДанныеТокенаКлассаСимволов(Отрицание));
202 | ДобавитьВТокенКлассаСимволов(Токен, "Диапазоны", Диапазоны);
203 |
204 | Возврат ТокеныНовогоКлассаСимволов(Токен);
205 | КонецФункции
206 |
207 | Функция ТокенМетаСимвола(Знач Значение)
208 | Возврат Новый Структура("Тип, Значение", РегуляркаПовтИсп.ТипТокенаМетасимвол(), Значение);
209 | КонецФункции
210 |
211 | Функция НовыйТокен(Знач Тип, Знач Данные = Неопределено)
212 | Возврат Новый Структура("Тип, Данные", Тип, Данные);
213 | КонецФункции
214 |
215 | Функция НовыеДанныеТокенаКлассаСимволов(Знач Отрицание = Ложь)
216 | Возврат Новый Структура("Отрицание, Класс", Отрицание, Новый Соответствие);
217 | КонецФункции
218 |
219 | Процедура ДобавитьДиапазон(Диапазоны, Знач ЛевыйСимвол, Знач ПравыйСимвол)
220 | Диапазоны.Добавить(Новый Структура("Начало, Окончание", КодСимвола(ЛевыйСимвол), КодСимвола(ПравыйСимвол)));
221 | КонецПроцедуры
222 |
223 | Процедура ДобавитьВТокенКлассаСимволов(Токен, Знач Ключ, Знач Значение = Истина)
224 | Токен.Данные.Класс.Вставить(Ключ, Значение);
225 | КонецПроцедуры
226 | #КонецОбласти
227 |
--------------------------------------------------------------------------------
/src/CommonModules/Регулярка/Ext/Module.bsl:
--------------------------------------------------------------------------------
1 |
2 | // SPDX-License-Identifier: MIT
3 |
4 | #Область ПрограммныйИнтерфейс
5 | // Возвращает объект процессора распознавания по переданному регулярному выражению (выбрасывает исключения)
6 | //
7 | // Параметры:
8 | // Шаблон - Строка - регулярное выражение
9 | //
10 | // Возвращаемое значение:
11 | // Структура - объект ответа:
12 | // * Шаблон - Массив - токены регулярного выражения,
13 | // * Орграф - Массив - НКА регулярного выражения
14 | //
15 | Функция ПроцессорРаспознавания(Знач Шаблон) Экспорт
16 | Токены = ТокеныШаблона("(" + Шаблон + ")");
17 | Орграф = НовыйОрграф(Токены.Количество() + 1);
18 | Стек = НовыйСтек();
19 | ИндексыОператоровИЛИ = Новый Массив;
20 | М = Токены.ВГраница();
21 | ЭтоТокенМета = Ложь;
22 |
23 | Для я = 0 По М Цикл
24 | ПозицияЛевойСкобки = я;
25 | Токен = Токены[я];
26 | ЭтоТокенМета = ЭтоТокенМетасимвола(Токен);
27 | Если ЭтоТокенМета Тогда
28 | Токен = Токен.Значение;
29 | Если Токен = "(" ИЛИ Токен = "|" Тогда
30 | ДобавитьВСтек(Стек, я);
31 | ИначеЕсли Токен = ")" Тогда
32 | ИндексыОператоровИЛИ.Очистить();
33 | ПредыдущийТокен = "";
34 | Пока ПредыдущийТокен <> "(" Цикл
35 | Если СтекПустой(Стек) Тогда
36 | ВызватьИсключение "Ошибка разбора шаблона";
37 | КонецЕсли;
38 |
39 | ПозицияОператора = ИзъятьИзСтека(Стек);
40 | ПредыдущийТокен = Токены[ПозицияОператора];
41 | Если НЕ ЭтоТокенМетасимвола(ПредыдущийТокен) Тогда
42 | ПредыдущийТокен = "";
43 | Продолжить;
44 | КонецЕсли;
45 | ПредыдущийТокен = ПредыдущийТокен.Значение;
46 | Если ПредыдущийТокен = "|" Тогда
47 | ИндексыОператоровИЛИ.Добавить(ПозицияОператора);
48 | ИначеЕсли ПредыдущийТокен = "(" Тогда
49 | ПозицияЛевойСкобки = ПозицияОператора;
50 | Для Каждого Индекс Из ИндексыОператоровИЛИ Цикл
51 | ДобавитьНаправлениеВОрграф(Орграф, ПозицияЛевойСкобки, Индекс+1);
52 | ДобавитьНаправлениеВОрграф(Орграф, Индекс, я);
53 | КонецЦикла;
54 | КонецЕсли;
55 | КонецЦикла;
56 | ИначеЕсли Токен = "]" Тогда
57 | ПозицияЛевойСкобки = я - 2;
58 | КонецЕсли;
59 | КонецЕсли;
60 | Если я < М Тогда
61 | СледующийТокен = Токены[я+1];
62 | Если ЭтоТокенМетасимвола(СледующийТокен) Тогда
63 | СледующийТокен = СледующийТокен.Значение;
64 | Если СледующийТокен = "*" Тогда
65 | ДобавитьНаправлениеВОрграф(Орграф, ПозицияЛевойСкобки, я+1);
66 | ДобавитьНаправлениеВОрграф(Орграф, я+1, ПозицияЛевойСкобки);
67 | ИначеЕсли СледующийТокен = "+" Тогда
68 | ДобавитьНаправлениеВОрграф(Орграф, я+1, ПозицияЛевойСкобки);
69 | ИначеЕсли СледующийТокен = "?" Тогда
70 | ДобавитьНаправлениеВОрграф(Орграф, ПозицияЛевойСкобки, я+2);
71 | КонецЕсли;
72 | КонецЕсли;
73 | КонецЕсли;
74 | Если ЭтоТокенМета Тогда
75 | ДобавитьНаправлениеВОрграф(Орграф, я, я+1);
76 | КонецЕсли;
77 | КонецЦикла;
78 |
79 | Возврат Новый Структура("Шаблон, Орграф", Токены, Орграф);
80 | КонецФункции
81 |
82 | // Выполняет проверку на полное соответствие текста регулярному выражению
83 | //
84 | // Параметры:
85 | // Процессор - Структура - процессора распознавания
86 | // Текст - Строка - текст, который будет проверятся процессором на полное соответствие
87 | //
88 | // Возвращаемое значение:
89 | // Булево - успешность проверки
90 | //
91 | Функция Распознано(Знач Процессор, Знач Текст) Экспорт
92 | ТипСтруктура = Тип("Структура");
93 | ТипСтрока = Тип("Строка");
94 | Вершины = ДостижимыеВершины(Процессор);
95 | Финал = Процессор.Шаблон.Количество();
96 |
97 | Для я = 1 По СтрДлина(Текст) Цикл
98 | Символ = Сред(Текст, я, 1);
99 | Совпадения = НовыйМешок();
100 | Для Каждого Вершина Из ЭлементыМешка(Вершины) Цикл
101 | Если Вершина < Финал Тогда
102 | Токен = Процессор.Шаблон[Вершина];
103 | ТипТокена = ТипЗнч(Токен);
104 | Если ТипТокена = ТипСтруктура Тогда
105 | Если Токен.Тип = РегуляркаПовтИсп.ТипТокенаКлассСимволов() И СимволУдовлетворяетКлассу(Символ, Токен) Тогда
106 | ДобавитьВМешок(Совпадения, Вершина+1);
107 | КонецЕсли;
108 | ИначеЕсли ТипТокена = ТипСтрока И Токен = Символ Тогда
109 | ДобавитьВМешок(Совпадения, Вершина+1);
110 | КонецЕсли;
111 | КонецЕсли;
112 | КонецЦикла;
113 |
114 | Вершины = ДостижимыеВершины(Процессор, Совпадения);
115 | КонецЦикла;
116 |
117 | Возврат ДостигнутаФинальнаяВершина(Вершины, Процессор);
118 | КонецФункции
119 |
120 | // Возвращает найденные процессором вхождения в тексте
121 | //
122 | // Параметры:
123 | // Процессор - Структура - процессора распознавания
124 | // Текст - Строка - текст, в котором будет осуществляться поиск вхождений
125 | //
126 | // Возвращаемое значение:
127 | // Массив - найденные вхождения. Элементы - Структура с ключами:
128 | // * НачальнаяПозиция - Число - позиция первого символа вхождения в тексте,
129 | // * Длина - Число - количество символов в найденном вхождении,
130 | // * Значение - Строка - строка вхождения
131 | //
132 | Функция Вхождения(Знач Процессор, Знач Текст) Экспорт
133 | фРезультат = Новый Массив;
134 | ТипСтруктура = Тип("Структура");
135 | ТипСтрока = Тип("Строка");
136 | Вершины = ДостижимыеВершины(Процессор);
137 | Финал = Процессор.Шаблон.Количество();
138 | Начало = 0;
139 | ЭтоПотенциальноеСовпадение = Ложь;
140 |
141 | Для я = 1 По СтрДлина(Текст) Цикл
142 | Символ = Сред(Текст, я, 1);
143 | Совпадения = НовыйМешок();
144 | Для Каждого Вершина Из ЭлементыМешка(Вершины) Цикл
145 | Если Вершина < Финал Тогда
146 | Токен = Процессор.Шаблон[Вершина];
147 | ТипТокена = ТипЗнч(Токен);
148 | Если ТипТокена = ТипСтруктура Тогда
149 | Если Токен.Тип = РегуляркаПовтИсп.ТипТокенаКлассСимволов() И СимволУдовлетворяетКлассу(Символ, Токен) Тогда
150 | Если Начало = 0 Тогда
151 | Начало = я;
152 | КонецЕсли;
153 | ДобавитьВМешок(Совпадения, Вершина+1);
154 | КонецЕсли;
155 | ИначеЕсли ТипТокена = ТипСтрока И Токен = Символ Тогда
156 | Если Начало = 0 Тогда
157 | Начало = я;
158 | КонецЕсли;
159 | ДобавитьВМешок(Совпадения, Вершина+1);
160 | КонецЕсли;
161 | КонецЕсли;
162 | КонецЦикла;
163 |
164 | Если МешокПуст(Совпадения) Тогда
165 | Если Начало > 0 Тогда
166 | Если ДостигнутаФинальнаяВершина(Вершины, Процессор) Тогда
167 | фРезультат.Добавить(НовоеВхождение(Начало, я, Текст));
168 | КонецЕсли;
169 | Вершины = ДостижимыеВершины(Процессор);
170 | я = я - 1;
171 | Начало = 0;
172 | ЭтоПотенциальноеСовпадение = Ложь;
173 | КонецЕсли;
174 | Продолжить;
175 | КонецЕсли;
176 |
177 | ЕстьФинальнаяВершина = Ложь;
178 | Вершины = ДостижимыеВершины(Процессор, Совпадения);
179 | Если ДостигнутаФинальнаяВершина(Вершины, Процессор) Тогда
180 | ЕстьФинальнаяВершина = Истина;
181 | ЭтоПотенциальноеСовпадение = Истина;
182 | КонецЕсли;
183 | Если ЭтоПотенциальноеСовпадение И НЕ ЕстьФинальнаяВершина Тогда
184 | фРезультат.Добавить(НовоеВхождение(Начало, я, Текст));
185 |
186 | Вершины = ДостижимыеВершины(Процессор);
187 | я = я - 1;
188 | Начало = 0;
189 | ЭтоПотенциальноеСовпадение = Ложь;
190 | КонецЕсли;
191 | КонецЦикла;
192 |
193 | Если ДостигнутаФинальнаяВершина(Вершины, Процессор) Тогда
194 | фРезультат.Добавить(НовоеВхождение(Начало, СтрДлина(Текст)+1, Текст));
195 | КонецЕсли;
196 |
197 | Возврат фРезультат;
198 | КонецФункции
199 | #КонецОбласти
200 |
201 | #Область СлужебныеПроцедурыИФункции
202 | #Область КОНСТРУКТОРЫ
203 | Функция НовыйСтек()
204 | Возврат Новый Массив;
205 | КонецФункции
206 |
207 | Функция НовыйМешок()
208 | Возврат Новый Структура("Первая, Хранилище", Неопределено, Новый Соответствие);
209 | КонецФункции
210 |
211 | Функция НоваяНода(Знач Значение)
212 | Возврат Новый Структура("Ссылка, Следующая, Значение", 0, Неопределено, Значение);
213 | КонецФункции
214 |
215 | Функция НовыйОрграф(Знач Мощность)
216 | фРезультат = Новый Массив;
217 | Для я = 1 По Мощность Цикл
218 | фРезультат.Добавить(НовыйМешок());
219 | КонецЦикла;
220 |
221 | Возврат фРезультат;
222 | КонецФункции
223 |
224 | Функция НовыйНаправленныйПоискВГлубину(Знач Орграф, Знач НомерВершины)
225 | фРезультат = Новый Массив;
226 | Для _ = 1 По КоличествоВершинОрграфа(Орграф) Цикл
227 | фРезультат.Добавить(Ложь);
228 | КонецЦикла;
229 |
230 | ПоискВГлубину(фРезультат, Орграф, НомерВершины);
231 |
232 | Возврат фРезультат;
233 | КонецФункции
234 |
235 | Функция НовыйНаправленныйПоискВГлубинуПоВершинам(Знач Орграф, Знач Источники)
236 | фРезультат = Новый Массив;
237 | Для _ = 1 По КоличествоВершинОрграфа(Орграф) Цикл
238 | фРезультат.Добавить(Ложь);
239 | КонецЦикла;
240 |
241 | Для Каждого Источник Из ЭлементыМешка(Источники) Цикл
242 | Если НЕ фРезультат.Получить(Источник) Тогда
243 | ПоискВГлубину(фРезультат, Орграф, Источник);
244 | КонецЕсли;
245 | КонецЦикла;
246 |
247 | Возврат фРезультат;
248 | КонецФункции
249 |
250 | Функция НовоеВхождение(Знач НачальнаяПозиция, Знач КонечнаяПозиция, Знач Текст)
251 | Возврат Новый Структура("НачальнаяПозиция, Длина, Значение", НачальнаяПозиция, КонечнаяПозиция - НачальнаяПозиция, Сред(Текст, НачальнаяПозиция, КонечнаяПозиция - НачальнаяПозиция));
252 | КонецФункции
253 | #КонецОбласти
254 |
255 | #Область Стек
256 | Процедура ДобавитьВСтек(Стек, Знач Значение)
257 | Стек.Добавить(Значение);
258 | КонецПроцедуры
259 |
260 | Функция ИзъятьИзСтека(Стек)
261 | Перем фРезультат;
262 | Если СтекПустой(Стек) Тогда
263 | Возврат фРезультат;
264 | КонецЕсли;
265 | фРезультат = Стек.Получить(Стек.ВГраница());
266 | Стек.Удалить(Стек.ВГраница());
267 | Возврат фРезультат;
268 | КонецФункции
269 |
270 | Функция ВзятьИзСтека(Знач Стек)
271 | Перем фРезультат;
272 | Если СтекПустой(Стек) Тогда
273 | Возврат фРезультат;
274 | КонецЕсли;
275 |
276 | Возврат Стек.Получить(Стек.ВГраница());
277 | КонецФункции
278 |
279 | Функция ЭлементыСтека(Знач Стек)
280 | фРезультат = Новый Массив;
281 |
282 | Если СтекПустой(Стек) Тогда
283 | Возврат фРезультат;
284 | КонецЕсли;
285 |
286 | я = Стек.ВГраница();
287 | Пока я >= 0 Цикл
288 | фРезультат.Добавить(Стек[я]);
289 | я = я - 1;
290 | КонецЦикла;
291 |
292 | Возврат фРезультат;
293 | КонецФункции
294 |
295 | Функция СтекПустой(Знач Стек)
296 | Возврат Стек.Количество() = 0;
297 | КонецФункции
298 | #КонецОбласти
299 |
300 | #Область Мешок
301 | Процедура ДобавитьВМешок(Мешок, Знач Значение)
302 | НоваяПервая = НоваяНода(Значение);
303 | ТекущаяПервая = Мешок.Первая;
304 | Если ТекущаяПервая <> Неопределено Тогда
305 | ТекущаяПервая = ТекущаяПервая.Ссылка;
306 | НоваяПервая.Ссылка = ТекущаяПервая + 1;
307 | КонецЕсли;
308 | НоваяПервая.Следующая = ТекущаяПервая;
309 | Мешок.Первая = НоваяПервая;
310 | Мешок.Хранилище.Вставить(НоваяПервая.Ссылка, НоваяПервая);
311 | КонецПроцедуры
312 |
313 | Функция РазмерМешка(Знач Мешок)
314 | Возврат Мешок.Хранилище.Количество();
315 | КонецФункции
316 |
317 | Функция МешокПуст(Знач Мешок)
318 | Возврат Мешок.Хранилище.Количество() = 0;
319 | КонецФункции
320 |
321 | Функция ЭлементыМешка(Знач Мешок)
322 | фРезультат = Новый Массив;
323 |
324 | Текущая = Мешок.Первая;
325 | Пока Текущая <> Неопределено Цикл
326 | фРезультат.Добавить(Текущая.Значение);
327 | Текущая = Мешок.Хранилище.Получить(Текущая.Следующая);
328 | КонецЦикла;
329 |
330 | Возврат фРезультат;
331 | КонецФункции
332 | #КонецОбласти
333 |
334 | #Область ОриентированныйГраф
335 | Функция КоличествоВершинОрграфа(Знач Орграф)
336 | Возврат Орграф.Количество();
337 | КонецФункции
338 |
339 | Функция КоличествоНаправленийОрграфа(Знач Орграф)
340 | фРезультат = 0;
341 |
342 | Для Каждого Направления Из Орграф Цикл
343 | фРезультат = фРезультат + РазмерМешка(Направления);
344 | КонецЦикла;
345 |
346 | Возврат фРезультат;
347 | КонецФункции
348 |
349 | Процедура ДобавитьНаправлениеВОрграф(Орграф, Знач НомерВершиныОтправления, Знач НомерВершиныНазначения)
350 | Направления = Орграф.Получить(НомерВершиныОтправления);
351 | ДобавитьВМешок(Направления, НомерВершиныНазначения);
352 | КонецПроцедуры
353 |
354 | Функция РеверсОрграфа(Знач Орграф)
355 | фРезультат = НовыйОрграф(КоличествоВершинОрграфа(Орграф));
356 |
357 | Для я = 0 По КоличествоВершинОрграфа(Орграф)-1 Цикл
358 | Для Каждого Направление Из ЭлементыМешка(Орграф.Получить(я)) Цикл
359 | ДобавитьНаправлениеВОрграф(фРезультат, я, Направление);
360 | КонецЦикла;
361 | КонецЦикла;
362 |
363 | Возврат фРезультат;
364 | КонецФункции
365 | #КонецОбласти
366 |
367 | #Область ПоискВГлубину
368 | Процедура ПоискВГлубину(Знач ОбъектПВГ, Знач Орграф, Знач НомерВершины)
369 | ОбъектПВГ.Установить(НомерВершины, Истина);
370 | Для Каждого Направление Из ЭлементыМешка(Орграф.Получить(НомерВершины)) Цикл
371 | Если НЕ ОбъектПВГ.Получить(Направление) Тогда
372 | ПоискВГлубину(ОбъектПВГ, Орграф, Направление);
373 | КонецЕсли;
374 | КонецЦикла;
375 | КонецПроцедуры
376 |
377 | Функция НайденоПоискомВГлубину(Знач ОбъектПВГ, Знач НомерВершины)
378 | Возврат ОбъектПВГ.Получить(НомерВершины);
379 | КонецФункции
380 | #КонецОбласти
381 |
382 | Функция ДостижимыеВершины(Знач Процессор, Знач Совпадения = Неопределено)
383 | фРезультат = НовыйМешок();
384 |
385 | ОбъектПВГ = ?(
386 | Совпадения = Неопределено,
387 | НовыйНаправленныйПоискВГлубину(Процессор.Орграф, 0),
388 | НовыйНаправленныйПоискВГлубинуПоВершинам(Процессор.Орграф, Совпадения)
389 | );
390 |
391 | Для Вершина = 0 По КоличествоВершинОрграфа(Процессор.Орграф) - 1 Цикл
392 | Если НайденоПоискомВГлубину(ОбъектПВГ, Вершина) Тогда
393 | ДобавитьВМешок(фРезультат, Вершина);
394 | КонецЕсли;
395 | КонецЦикла;
396 |
397 | Возврат фРезультат;
398 | КонецФункции
399 |
400 | Функция ДостигнутаФинальнаяВершина(Знач Вершины, Знач Процессор)
401 | Финал = Процессор.Шаблон.Количество();
402 |
403 | Для Каждого Вершина Из ЭлементыМешка(Вершины) Цикл
404 | Если Вершина = Финал Тогда
405 | Возврат Истина;
406 | КонецЕсли;
407 | КонецЦикла;
408 |
409 | Возврат Ложь;
410 | КонецФункции
411 |
412 | Функция ТокеныШаблона(Знач Шаблон)
413 | фРезультат = Новый Массив;
414 | МетаСимволы = РегуляркаПовтИсп.Метасимволы();
415 |
416 | Для я = 1 По СтрДлина(Шаблон) Цикл
417 | Символ = Сред(Шаблон, я, 1);
418 | Если Символ = "[" Тогда
419 | ОбработатьКлассСимволов(фРезультат, я, Шаблон);
420 | ИначеЕсли Символ = "{" Тогда
421 | ОбработатьКвантификатор(фРезультат, я, Шаблон);
422 | ИначеЕсли Символ = "\" Тогда
423 | ОбработатьЭкранирование(фРезультат, я, Шаблон);
424 | ИначеЕсли МетаСимволы.Получить(Символ) <> Неопределено Тогда
425 | фРезультат.Добавить(ТокенМетаСимвола(Символ));
426 | ИначеЕсли Символ = "." Тогда
427 | фРезультат.Добавить(НовыйТокенОбъект(РегуляркаПовтИсп.ТипТокенаКлассСимволов(), НовыеДанныеТокенаКлассаЛюбыхСимволов()));
428 | Иначе
429 | фРезультат.Добавить(Символ);
430 | КонецЕсли;
431 | КонецЦикла;
432 |
433 | Возврат фРезультат;
434 | КонецФункции
435 |
436 | Процедура ОбработатьКлассСимволов(Токены, Индекс, Знач Шаблон)
437 | Отрицание = Ложь;
438 | СимволыКласса = Новый Массив;
439 | ПозицииСимволов = Новый Массив;
440 |
441 | Индекс = Индекс + 1;
442 | СледующийСимвол = Сред(Шаблон, Индекс, 1);
443 | Если СледующийСимвол = "^" Тогда
444 | Отрицание = Истина;
445 | Индекс = Индекс + 1;
446 | СледующийСимвол = Сред(Шаблон, Индекс, 1);
447 | КонецЕсли;
448 | Экранирован = Ложь;
449 | Пока СледующийСимвол <> "]" ИЛИ Экранирован Цикл
450 | Экранирован = (СледующийСимвол = "\");
451 | СимволыКласса.Добавить(СледующийСимвол);
452 | Индекс = Индекс + 1;
453 | СледующийСимвол = Сред(Шаблон, Индекс, 1);
454 | КонецЦикла;
455 |
456 | М = СимволыКласса.ВГраница();
457 | Диапазоны = Новый Массив;
458 |
459 | Для я = 0 По М Цикл
460 | Если СимволыКласса[я] = "\" Тогда
461 | я = я + 1;
462 |
463 | ОбработатьЭкранированныйСимволКласса(СимволыКласса, я);
464 | ИначеЕсли СимволыКласса[я] = "-" И 0 < я И я < М Тогда
465 | СимволНачала = СимволыКласса[я-1];
466 | СимволОкончания = СимволыКласса[я+1];
467 | Если СимволОкончания = "\" Тогда
468 | я = я + 2;
469 |
470 | ОбработатьЭкранированныйСимволКласса(СимволыКласса, я);
471 |
472 | СимволОкончания = СимволыКласса[я];
473 | Иначе
474 | я = я + 1;
475 | КонецЕсли;
476 | ДобавитьДиапазон(Диапазоны, СимволНачала, СимволОкончания);
477 | ПозицииСимволов.Удалить(ПозицииСимволов.ВГраница());
478 | Продолжить;
479 | КонецЕсли;
480 |
481 | ПозицииСимволов.Добавить(я);
482 | КонецЦикла;
483 |
484 | Токен = НовыйТокенОбъект(РегуляркаПовтИсп.ТипТокенаКлассСимволов(), НовыеДанныеТокенаКлассаСимволов(Отрицание));
485 | Для Каждого я Из ПозицииСимволов Цикл
486 | ДобавитьВТокенКлассаСимволов(Токен, СимволыКласса[я]);
487 | КонецЦикла;
488 | Если Диапазоны.Количество() > 0 Тогда
489 | ДобавитьВТокенКлассаСимволов(Токен, "Диапазоны", Диапазоны);
490 | КонецЕсли;
491 |
492 | Токены.Добавить(ТокенМетаСимвола("["));
493 | Токены.Добавить(Токен);
494 | Токены.Добавить(ТокенМетаСимвола("]"));
495 | КонецПроцедуры
496 |
497 | Функция НовыйТокенОбъект(Знач Тип, Знач Данные = Неопределено)
498 | Возврат Новый Структура("Тип, Данные", Тип, Данные);
499 | КонецФункции
500 |
501 | Функция НовыеДанныеТокенаКлассаСимволов(Знач Отрицание = Ложь)
502 | Возврат Новый Структура("Отрицание, Класс", Отрицание, Новый Соответствие);
503 | КонецФункции
504 |
505 | Функция НовыеДанныеТокенаКлассаЛюбыхСимволов()
506 | Возврат Новый Структура("Отрицание, Класс", Ложь, Неопределено);
507 | КонецФункции
508 |
509 | Процедура ДобавитьДиапазон(Диапазоны, Знач ЛевыйСимвол, Знач ПравыйСимвол)
510 | Диапазоны.Добавить(Новый Структура("Начало, Окончание", КодСимвола(ЛевыйСимвол), КодСимвола(ПравыйСимвол)));
511 | КонецПроцедуры
512 |
513 | Процедура ДобавитьВТокенКлассаСимволов(Токен, Знач Ключ, Знач Значение = Истина)
514 | Токен.Данные.Класс.Вставить(Ключ, Значение);
515 | КонецПроцедуры
516 |
517 | Функция ТокенМетаСимвола(Знач Значение)
518 | Возврат Новый Структура("Тип, Значение", РегуляркаПовтИсп.ТипТокенаМетасимвол(), Значение);
519 | КонецФункции
520 |
521 | Функция ЭтоТокенМетасимвола(Знач Токен)
522 | Возврат ТипЗнч(Токен) = Тип("Структура") И Токен.Тип = РегуляркаПовтИсп.ТипТокенаМетасимвол();
523 | КонецФункции
524 |
525 | Функция СимволУдовлетворяетКлассу(Знач Символ, Знач Токен)
526 | Принадлежит = СимволПринадлежитКлассу(Символ, Токен);
527 |
528 | Возврат ?(Токен.Данные.Отрицание, НЕ Принадлежит, Принадлежит);
529 | КонецФункции
530 |
531 | Функция СимволПринадлежитКлассу(Знач Символ, Знач Токен)
532 | Если Токен.Данные.Класс = Неопределено Тогда // .
533 | Возврат Истина;
534 | КонецЕсли;
535 |
536 | Если Токен.Данные.Класс.Получить(Символ) <> Неопределено Тогда
537 | Возврат Истина;
538 | КонецЕсли;
539 |
540 | Диапазоны = Токен.Данные.Класс.Получить("Диапазоны");
541 | Если Диапазоны = Неопределено Тогда
542 | Возврат Ложь;
543 | КонецЕсли;
544 |
545 | Код = КодСимвола(Символ);
546 | Для Каждого Диапазон Из Диапазоны Цикл
547 | Если Диапазон.Начало <= Код И Код <= Диапазон.Окончание Тогда
548 | Возврат Истина;
549 | КонецЕсли;
550 | КонецЦикла;
551 |
552 | Возврат Ложь;
553 | КонецФункции
554 |
555 | Процедура ОбработатьЭкранированныйСимволКласса(СимволыКласса, Индекс)
556 | Если СимволыКласса[Индекс] = "x" Тогда // 0xhh
557 | Символ = СимволПоДвузначномуHexКоду(СимволыКласса[Индекс+1] + СимволыКласса[Индекс+2]);
558 | Индекс = Индекс + 2;
559 | ИначеЕсли СимволыКласса[Индекс] = "u" Тогда // 0xhhhh
560 | Символ = СимволПоЧетырехзначномуHexКоду(СимволыКласса[Индекс+1] + СимволыКласса[Индекс+2] + СимволыКласса[Индекс+3] + СимволыКласса[Индекс+4]);
561 | Индекс = Индекс + 4;
562 | Иначе
563 | Символ = РегуляркаПовтИсп.ЭкранированияСимволовВКлассе().Получить(СимволыКласса[Индекс]);
564 | Если Символ = Неопределено Тогда
565 | ВызватьИсключение "неподдерживаемый ключ экранирования: " + Символ;
566 | КонецЕсли;
567 | КонецЕсли;
568 |
569 | СимволыКласса[Индекс] = Символ;
570 | КонецПроцедуры
571 |
572 | Процедура ОбработатьКвантификатор(Токены, Индекс, Знач Шаблон)
573 | СимволыКвантификатора = Новый Массив;
574 | Индекс = Индекс + 1;
575 | СледующийСимвол = Сред(Шаблон, Индекс, 1);
576 | Пока СледующийСимвол <> "}" Цикл
577 | СимволыКвантификатора.Добавить(СледующийСимвол);
578 | Индекс = Индекс + 1;
579 | СледующийСимвол = Сред(Шаблон, Индекс, 1);
580 | КонецЦикла;
581 |
582 | ЧастиКвантификатора = СтрРазделить(СтрСоединить(СимволыКвантификатора), ",");
583 | Если ЧастиКвантификатора.Количество() = 0 Тогда
584 | Возврат;
585 | КонецЕсли;
586 |
587 | ДополнительныеТокены = Новый Массив;
588 | ТипЧисло = Новый ОписаниеТипов("Число");
589 | МинимумПовторений = ТипЧисло.ПривестиЗначение(СокрЛП(ЧастиКвантификатора[0]));
590 | МаксимумПовторений = МинимумПовторений;
591 | Если ЧастиКвантификатора.Количество() > 1 Тогда
592 | МаксимумПовторений = ТипЧисло.ПривестиЗначение(СокрЛП(ЧастиКвантификатора[1]));
593 | КонецЕсли;
594 | Если МаксимумПовторений > 0 И МаксимумПовторений < МинимумПовторений Тогда
595 | ВызватьИсключение "Ошибка разбора шаблона";
596 | ИначеЕсли МинимумПовторений = 0 Тогда
597 | Если МаксимумПовторений < 2 Тогда
598 | Токены.Добавить(ТокенМетаСимвола(?(МаксимумПовторений = 0, "*", "?")));
599 | Возврат;
600 | КонецЕсли;
601 | ДополнительныеТокены.Добавить(ТокенМетаСимвола("?"));
602 | МаксимумПовторений = МаксимумПовторений - 1;
603 | ИначеЕсли МинимумПовторений = 1 И МаксимумПовторений = 0 Тогда
604 | Токены.Добавить(ТокенМетаСимвола("+"));
605 | Возврат;
606 | КонецЕсли;
607 |
608 | ТокеныПовторения = Новый Массив;
609 | ПредыдущийТокен = Токены[Токены.ВГраница()];
610 | Если ЭтоТокенМетасимвола(ПредыдущийТокен) Тогда
611 | Если ПредыдущийТокен.Значение = "]" Тогда
612 | ТокеныПовторения.Добавить(ТокенМетаСимвола("["));
613 | ТокеныПовторения.Добавить(Токены[Токены.ВГраница()-1]);
614 | ТокеныПовторения.Добавить(ТокенМетаСимвола("]"));
615 | ИначеЕсли ПредыдущийТокен.Значение = ")" Тогда
616 | Стек = НовыйСтек();
617 | я = Токены.ВГраница();
618 | Пока я >= 0 Цикл
619 | Токен = Токены[я];
620 | ДобавитьВСтек(Стек, Токен);
621 | Если ЭтоТокенМетасимвола(Токен) И Токен.Значение = "(" Тогда
622 | Прервать;
623 | КонецЕсли;
624 | я = я - 1;
625 | КонецЦикла;
626 | ТокеныПовторения = ЭлементыСтека(Стек);
627 | КонецЕсли;
628 | Иначе
629 | ТокеныПовторения.Добавить(ПредыдущийТокен);
630 | КонецЕсли;
631 |
632 | Для Каждого Токен Из ДополнительныеТокены Цикл
633 | Токены.Добавить(Токен);
634 | КонецЦикла;
635 |
636 | Для я = 1 По МинимумПовторений - 1 Цикл
637 | Для Каждого Токен Из ТокеныПовторения Цикл
638 | Токены.Добавить(Токен);
639 | КонецЦикла;
640 | КонецЦикла;
641 | Если МаксимумПовторений = 0 Тогда
642 | Токены.Добавить(ТокенМетаСимвола("+"));
643 | Возврат;
644 | КонецЕсли;
645 | Для я = 1 По МаксимумПовторений - МинимумПовторений Цикл
646 | Для Каждого Токен Из ТокеныПовторения Цикл
647 | Токены.Добавить(Токен);
648 | КонецЦикла;
649 | Токены.Добавить(ТокенМетаСимвола("?"));
650 | КонецЦикла;
651 | КонецПроцедуры
652 |
653 | Процедура ОбработатьЭкранирование(Токены, Индекс, Знач Шаблон)
654 | Индекс = Индекс + 1;
655 | СледующийСимвол = Сред(Шаблон, Индекс, 1);
656 |
657 | Символ = РегуляркаПовтИсп.ЭкранированияСимволов().Получить(СледующийСимвол);
658 | Если Символ <> Неопределено Тогда
659 | Токены.Добавить(Символ);
660 | Возврат;
661 | КонецЕсли;
662 |
663 | ТокеныКласса = РегуляркаПовтИсп.ПредопределенныеКлассыСимволов().Получить(СледующийСимвол);
664 | Если ТокеныКласса <> Неопределено Тогда
665 | Для Каждого Токен Из ТокеныКласса Цикл
666 | Токены.Добавить(Токен);
667 | КонецЦикла;
668 | Возврат;
669 | КонецЕсли;
670 |
671 | Если СледующийСимвол = "x" Тогда // 0xhh
672 | Токены.Добавить(СимволПоДвузначномуHexКоду(Шаблон, Индекс));
673 | Индекс = Индекс + 2;
674 | Возврат;
675 | КонецЕсли;
676 |
677 | Если СледующийСимвол = "u" Тогда // 0xhhhh
678 | Токены.Добавить(СимволПоЧетырехзначномуHexКоду(Шаблон, Индекс));
679 | Индекс = Индекс + 4;
680 | Возврат;
681 | КонецЕсли;
682 |
683 | ВызватьИсключение "неподдерживаемый ключ экранирования: " + СледующийСимвол;
684 | КонецПроцедуры
685 |
686 | Функция СимволПоДвузначномуHexКоду(Знач Шаблон, Знач Индекс = 0)
687 | фРезультат = Новый Массив;
688 | фРезультат.Добавить(Сред(Шаблон, Индекс+1, 1));
689 | фРезультат.Добавить(Сред(Шаблон, Индекс+2, 1));
690 |
691 | Возврат Символ(ШвД(СтрСоединить(фРезультат)));
692 | КонецФункции
693 |
694 | Функция СимволПоЧетырехзначномуHexКоду(Знач Шаблон, Знач Индекс = 0)
695 | фРезультат = Новый Массив;
696 | фРезультат.Добавить(Сред(Шаблон, Индекс+1, 1));
697 | фРезультат.Добавить(Сред(Шаблон, Индекс+2, 1));
698 | фРезультат.Добавить(Сред(Шаблон, Индекс+3, 1));
699 | фРезультат.Добавить(Сред(Шаблон, Индекс+4, 1));
700 |
701 | Возврат Символ(ШвД(СтрСоединить(фРезультат)));
702 | КонецФункции
703 |
704 | Функция ШвД(Знач ЧислоHex)
705 | фРезультат = 0;
706 |
707 | ЧислоHex = ВРег(СокрЛП(ЧислоHex));
708 | Степень = СтрДлина(ЧислоHex) - 1;
709 | ЗначенияDec = РегуляркаПовтИсп.ЗначенияЦифрHexВDec();
710 |
711 | Для я = 1 По СтрДлина(ЧислоHex) Цикл
712 | ЗначениеDec = ЗначенияDec.Получить(Сред(ЧислоHex, я, 1));
713 | Если ЗначениеDec = Неопределено Тогда
714 | ВызватьИсключение "неожиданный символ hex: " + Сред(ЧислоHex, 1, 1);
715 | КонецЕсли;
716 | Если ЗначениеDec > 0 Тогда
717 | фРезультат = фРезультат + ЗначениеDec * Pow(16, Степень);
718 | КонецЕсли;
719 | Степень = Степень - 1;
720 | КонецЦикла;
721 |
722 | Возврат фРезультат;
723 | КонецФункции
724 | #КонецОбласти
725 |
--------------------------------------------------------------------------------