├── .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 | --------------------------------------------------------------------------------