Внешняя компонента для выполнения регулярных выражений

14.01.22

Разработка - Разработка внешних компонент

Внешняя Native API компонента для выполнения регулярных выражений на платформе 1С:Предприятие 8. Написана на C++. Используется движок PCRE2 версии 10.36 (до версии 13, использовался boost::regex v 1.69). Версия синтаксиса Perl Compatible Regular Expressions.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
RegEx1CAddin_14.zip
.zip 516,42Kb ver:14
56 2 500 руб. Купить
RegExMac64_14.so
.so 426,45Kb ver:14
6 2 500 руб. Купить
RegEx1CAddin_Android_14.zip
.zip 316,12Kb ver:14
5 2 500 руб. Купить
RegEx1CAddin_Browsers_14.zip
.zip 440,11Kb ver:14
2 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

Текущая версия собрана для следующих платформ:
Windows 32bit 

Windows 64bit 

Linux 32bit 

Linux 64bit

MacOS 64bit

Android ARMv7-A

Android x86-64

Google Chrome (Windows)

Тестировалось на платформе 8.3.12.1567 (Windows 7, Windows Server 2008 R2, Ubuntu 14 32-64bit, MacOS Sierra 10.12, Android 8)

Адрес open-source проекта на GitHub: https://github.com/alexkmbk/RegEx1CAddin

Бинарные файлы можно скачать также с GitHub: https://github.com/alexkmbk/RegEx1CAddin/releases

Архив содержит скомпилированный набор компонент, предназначенный для загрузки в общий макет конфигурации.

Сборка осуществлялась с использованием следующих инструментов:

Под Windows: Microsoft Visual Studio Community 2017

Под Linux: GCC 6

Под Mac OS: Clang 9   

Под Android: Android Studio NDK 19.2

Использовалась статическая сборка, поэтому компонента не требует установки каких-либо дополнительных библиотек.

Компонента реализует следующие методы и свойства:

Метод НайтиСовпадения / Matches(<Текст для анализа>, [<Регулярное выражение>], [<ИерархическийОбходРезультатов>])

Метод выполняет поиск в переданном тексте по переданному регулярному выражению.

Результатом выполнения метода будет массив результатов поиска.

Здесь, <ИерархическийОбходРезультатов> - определяет то, как будет осуществлен обход результатов. По умолчанию = Ложь. Если ИерархическийОбходРезультатов=Ложь, тогда каждый элемент массива результатов поиска - найденная подгруппа поиска. Если подгрупп нет, то массив будет содержать один элемент - найденную строку. Если ИерархическийОбходРезультатов=Истина, тогда, каждый элемент массива результатов поиска будет содержать только найденную строку, а значение подгруппы при их наличии, можно будет получить методом ПолучитьПодгруппу.

Возвращаемое значение: Ничего не возвращает.

Для того, чтобы получить результаты выполнения метода (массив результатов), необходимо выполнить метод Следующий/Next(), и после этого, в свойстве ТекущееЗначение/CurrentValue будет доступно значение текущей подгруппы результата выполнения (текущий элемент массива результатов). Идея похожа на обход результата запроса.

Пример:

Рег.НайтиСовпадения("Hello world", "([A-Za-z]+)\s+([a-z]+)");

Пока Рег.Следующий() Цикл
    Сообщить(Рег.ТекущееЗначение);    
КонецЦикла; 

Результат будет содержать 3 элемента:

Hello world
Hello
world

Пример с иерархическим обходом:

Рег.НайтиСовпадения("Hello world", "([A-Za-z]+)\s+([a-z]+)", Истина);

Пока Рег.Следующий() Цикл 

Сообщить(Рег.ТекущееЗначение); // Hello world 
Сообщить(Рег.ПолучитьПодгруппу(0)); // Hello 
Сообщить(Рег.ПолучитьПодгруппу(1)); // world 
КонецЦикла; 

Результат будет содержать 1 элемент и 2 подгруппы, а вывод будте таким же:

Hello world

Hello

world

Метод Количество \ Count()

Возвращает количество результатов поиска, после выполнения метода НайтиСовпадения / Matches

Метод КоличествоВложенныхГрупп() \ SubMatchesCount()

Метод возвращает количество групп (подгрупп\SubMatches) если в шаблоне были заданы группы, например, для шаблона ([A-Za-z]+)\s+([a-z]+) будет возвращено значение 2. Метод возвращает значение только после выполнения метода НайтиСовпадения \ Matches.

Метод ПолучитьПодгруппу \ GetSubMatch(<ИндексПодгруппы>)

Метод возвращает строковое значение подгруппы из результатов поиска методом НайтиСовпадения \ Matches. У метода один параметр - Индекс группы, он задает индекс группы, который следует получить(доступны значения от 0 до КоличествоВложенныхГрупп - 1).

Метод НайтиСовпаденияJSON \ MatchesJSON(<Текст для анализа>, [<Регулярное выражение>])

Метод выполняет поиск в переданном тексте по переданному регулярному выражению.

Результатом выполнения метода будет строка в формате JSON представляющая собой массив структур.

Метод позволяет значительно быстрее получить и обработать результат поиска (за счет минимизации вызовов методов через NativeAPI).

Метод Заменить \ Replace(<Текст для анализа>, [<Регулярное выражение>], <Значение для замены>).

Заменяет в переданном тексте часть, соответствующую регулярному выражению, значением, переданным третьим параметром.

Возвращаемое значение: Строка, результат замены.

Метод Совпадает \ IsMatch \ Test(<Текст для анализа>, [<Регулярное выражение>])

Делает проверку на соответствие текста регулярному выражению.

Возвращаемое значение: Булево. Возвращает значение Истина если текст соответствует регулярному выражению.

Метод Версия \ Version()

Возвращает номер версии компоненты в виде строки.

Возвращаемое значение: Строка

Свойство ВсеСовпадения \ Global

Тип: Булево.

Значение по умолчанию: Ложь.

Если установлено в Истина, то поиск будет выполняться по всем совпадениям, а не только по первому.

 

Свойство Multiline \ Многострочный

Тип: Булево.

Значение по умолчанию: Истина.

Если установлено в Истина, то началом строки считаются также и символы перевода строки.

 

Свойство ИгнорироватьРегистр \ IgnoreCase

Тип: Булево.

Значение по умолчанию: Ложь.

Если установлено в Истина, то поиск будет осуществляться без учета регистра.

Свойство Шаблон \ Pattern

Тип: Строка.

Значение по умолчанию: пустая строка.

Задает регулярное выражение которое будет использоваться при вызове методов компоненты, если в метод не передано значение регулярного выражения.

 

Свойство FirstIndex

Тип: Число.

Аналог свойства FirstIndex из VBScript.RegExp. Возвращает индекс (начинается с 0) первого символа найденного текста в исходной строке.

 

Свойство UCP

Тип: Булево.

Значение по умолчанию: Ложь.

Свойство устанавливает флаг PCRE2_UCP в методе pcre2_compile, что включает обработку всех символов Unicode для директив \W и \w (а не только ASCII).

 

Свойство ОписаниеОшибки \ ErrorDescription

Тип: Строка.

Значение по умолчанию: пустая строка.

Содержит текст последней ошибки. Если ошибки не было, то пустая строка.

Свойство ВызыватьИсключения \ ThrowExceptions

Тип: Булево.

Значение по умолчанию: Ложь.

Если установлена в Истина, то при возникновении ошибки, будет вызываться исключение, при обработке исключения, текст ошибки можно получить из свойства ErrorDescription\ОписаниеОшибки.

Пример использования:

Предполагается что архив с компонентами был загружен в общий макет "RegEx"

УстановитьВнешнююКомпоненту("ОбщийМакет.RegEx");
ПодключитьВнешнююКомпоненту("ОбщийМакет.RegEx", "Component", ТипВнешнейКомпоненты.Native);
            
Рег = Новый("AddIn.Component.RegEx");

Рег.НайтиСовпадения("Hello world", "([A-Za-z]+)\s+([a-z]+)", Истина);

Сообщить(Рег.Количество()); // 1 - всего один результат 
Сообщить(Рег.КоличествоВложенныхГрупп()); // 2 - две подгруппы (submatches)

Пока Рег.Следующий() Цикл 
Сообщить(Рег.ТекущееЗначение); // Hello world 
Сообщить(Рег.ПолучитьПодгруппу(0)); // Hello 
Сообщить(Рег.ПолучитьПодгруппу(1)); // world 
КонецЦикла;

Сообщить(Рег.Совпадает("Hello world", "([A-Za-z]+)\s+([a-z]+)"));
Сообщить(Рег.Заменить("Hello world", "([A-Za-z]+)\s+([a-z]+)", "Текст для замены"));

 

Пример в асинхронном режиме с использованием обещаний (доступно с версии платформы 8.3.18):

&НаКлиенте
Асинх Функция ПодключитьРегулярныеВыражения()
	
	Подключено = Ждать ПодключитьВнешнююКомпонентуАсинх( "ОбщийМакет.RegEx", "Component", ТипВнешнейКомпоненты.Native);
	
	Если НЕ Подключено Тогда 
		
		Ждать УстановитьВнешнююКомпонентуАсинх("ОбщийМакет.RegEx");
		Подключено =  Ждать ПодключитьВнешнююКомпонентуАсинх( "ОбщийМакет.RegEx", "Component", ТипВнешнейКомпоненты.Native);
		
	КонецЕсли;
	
	Возврат Подключено;
	
КонецФункции	

&НаКлиенте
Асинх Процедура Асинхронно(Команда)
	
	Подключено =  Ждать ПодключитьРегулярныеВыражения();
	Если Подключено Тогда
		
		Рег = Новый("AddIn.Component.RegEx"); 
		
		Ждать Рег.УстановитьШаблонАсинх("([A-Za-z]+)\s+([a-z]+)");		
		Ждать Рег.НайтиСовпаденияАсинх("Hello world");
		
		Пока Истина Цикл

			Результат = Ждать Рег.СледующийАсинх();   
			
			Если НЕ Результат.Значение Тогда
				Прервать;        
			КонецЕсли;  
			
			Результат = Ждать Рег.ПолучитьТекущееЗначениеАсинх();
			Сообщить(Результат);    
			
		КонецЦикла; 
	КонецЕсли; 
	
КонецПроцедуры

 

Вступайте в нашу телеграмм-группу Инфостарт

Регулярные выражения RegEx Внешняя компонента

См. также

Разработка внешних компонент Телефония, SIP Разработчик 1С:Предприятие 8 1C:Бухгалтерия Россия Платные (руб)

Внешняя компонента выполнена по технологии Native API для 1С 8.х, обеспечивает доступ к программным АТС Asterisk (FreePBX, Elastix) через AMI интерфейс. Через него можно управлять многими функциями Asterisk (определение номеров, перевод звонков, набор телефона и т. д.)

5246 руб.

04.05.2018    52183    128    68    

72

Разработка внешних компонент Разработчик 1С:Предприятие 8 1C:Бухгалтерия 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 Платные (руб)

Внешняя компонента позволяет работать c TWAIN-совместимым оборудованием (сканерами, камерами) . Полностью совместима со стандартной TWAIN-компонентой из БСП и может применяться как ее замена без изменения вызовов, при этом может работать с 64-разрядной платформой, а так же имеет расширенную функциональность, например, сохранение результата непосредственно в PDF без использования сторонних утилит. Прекрасно работает на сервере, тонком клиенте и веб-клиенте (проверена работа в браузерах Google Chrome, Mozilla Firefox и Microsoft Internet Explorer).

5084 руб.

12.05.2020    34937    147    100    

103

Разработка внешних компонент Инструментарий разработчика Разработчик 1С 8.3 Бесплатно (free)

Внешняя обработка проверяет выгрузку конфигурации, расширений и внешних обработок и находит места, где код руками делает то, что платформа умеет штатно: регулярки через COM, пауза пустым циклом, свой хеш и Base64, распаковка архивов программой, буфер обмена через HTML-поле. По каждой находке пишет, доступна ли замена на месте или мешает тонкий клиент.

13.10.2026    1268    144    nedomolkov.ivan    5    

22

Разработка внешних компонент Разработчик 1С:Предприятие 8 Бесплатно (free)

Нативная внешняя компонента для 1С 8 для чтения файлов Excel без установленного Excel и делает это быстро, файл 68МБ загружается в таблицу значений ~1 секунду. Компонента поддерживает чтение двух форматов: Excel 2007+ и Excel 97-2003 Формат файла определяется автоматически по сигнатуре (первые 8 байт файла), а не по расширению. Позволяет открывать XLS и XLSX файлы и получать содержимое листов в виде ТаблицыЗначений или JSON-массива.

03.07.2026    2353    skyadmin    31    

24

Разработка внешних компонент Разработчик 1С 8.3 Бесплатно (free)

В современных корпоративных решениях на платформе 1С:Предприятие 8.3 всё чаще возникает потребность в визуальном моделировании и автоматизации бизнес-процессов с использованием нотации BPMN 2.0. Стандартные средства платформы не предоставляют полноценного редактора BPMN, однако интеграция открытой библиотеки bpmn-js позволяет реализовать интерактивное моделирование бизнес-процессов непосредственно в 1С. В статье рассмотрены архитектура решения, пошаговая инструкция по сборке библиотеки из исходников для WebKit, а также примеры программного взаимодействия между 1С и JavaScript.

03.04.2026    4248    SultanovStas    8    

23

Разработка внешних компонент Системный администратор Разработчик Стажер Бесплатно (free)

Библиотека для работы с базами SQLite из 1С на основе внешней компоненты. Для Linux и Windows, бесплатно и с открытым исходным кодом!

14.01.2025    8202    bayselonarrend    17    

54

Разработка внешних компонент Разработчик 1С:Предприятие 8 Россия Бесплатно (free)

В статье описывается приложение-конструктор внешних компонент (native API). Конструктор упрощает процесс разработки за счет удобного добавления всех нужных функций и процедур в графическом режиме, с указанием их параметров и типов параметров. На выходе приложение генерирует готовый код на С++ и Rust и позволяет сразу приступить к реализации, без настройки API компоненты вручную.

04.12.2024    13775    kovalevdmv    29    

84
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Dzenn 936 12.11.18 10:45 Сейчас в теме
Буду гадом ;-) На инфостарте есть что-то про регулярные выражения в 1С на основе механизмов работы с XML. То есть, помещаем в поле-HTML нашу строку, обёрнутую в тэги, запускаем встроенную функцию и получаем ответ. Но не уверен, что это аналог, с регулярками особо не приходилось работать.
4. ImHunter 351 12.11.18 12:39 Сейчас в теме
(1) Есть такое, через XDTO делается. Но такой прием работы предназначен только для валидации строки к паттерну.
Т.е. количество и/или место вхождения паттерна - так не найти.
starik-2005; AlX0id; mivari; 🅵🅾️🆇; A_Max; +5 – Ответить
6. A_Max 21 12.11.18 12:47 Сейчас в теме
(1) Там ОООООООЧЕНЬ ограниченный функционал.
2. zykov_vitaliy 90 12.11.18 11:36 Сейчас в теме
Использую
Regexp = Новый COMОбъект("VBScript.RegExp");
3. KAV2 159 12.11.18 11:47 Сейчас в теме
(2) Данная компонента работает также под Linux. В планах собрать под MacOS если будут время и силы.
snikov; 7OH; starik-2005; A_Max; +4 – Ответить
14. 🅵🅾️🆇 528 12.11.18 17:45 Сейчас в теме
(3) Не думаю, что стоит под огрызок собирать.
Такие компоненты лучше подключать на сервере, вряд ли есть извращенцы хостящиеся на macos (да пусть даже и файловые базы).
41. KAV2 159 19.12.18 18:43 Сейчас в теме
(14) Ну так или иначе, а сборка под Mac OS уже доступна :-)
leoxz; 🅵🅾️🆇; +2 – Ответить
5. A_Max 21 12.11.18 12:46 Сейчас в теме
(2) этой штуки нет в linux, а так всё необходимое имеем при себе в базе!
Давно у самого чесались руки самому написать "универсальную" внешнюю компоненту.
7. nixel 1474 12.11.18 15:35 Сейчас в теме
Спасибо огромное!
sashocq; Labotamy; iliabvf; s_vidyakin; +4 –2 Ответить
8. Ershov Mikhail 12.11.18 16:13 Сейчас в теме
Идея хорошая, но поясните один момент:
Текст для анализа, препологается передавать в виде параметра внешней компоненты.
например у меня есть лог файл размером 30 Гб. (Txt), правильно ли я понимаю, что перед тем как передать этот текст внешней компоненте, мне необходимо загрузить его в оперативную память ? ... а в чём тогда смысл этой компоненты ? ведь одно из основных преимуществ регэкспа - это поточная обработка текста, вне зависимости от размера файла, т.е "Часть прочитал, часть отпустил"... а тут получается сначала загрузи всё в оперативную память а потом запускай свой конвеер Regex ... как то "не айс", а текстовым файлом в 100 ГБ я также как и без регекспа имею возможность положить сервер по недостатку памяти. Получается "Кайф" от Regexpa потерян ...
... или я неправ ?
9. KAV2 159 12.11.18 16:19 Сейчас в теме
(8) В данном случае можно использовать объект ЧтениеТекста\TextReader. Этот объект может читать не весь файл целиком , а построчно.
Ershov Mikhail; +1 – Ответить
10. Ershov Mikhail 12.11.18 16:22 Сейчас в теме
(9) т.е. сначала я построчно его читаю 1С-ом, а потом передаю Regex компоненте ... но ведь тогда скорость обработки будет примерна такаяже как и без Regexa ... узкое место получается чтение 1С ... а может сделать возможность передавать компоненте путь к файлу ?
11. KAV2 159 12.11.18 16:29 Сейчас в теме
(10)Может быть, но пока не готов по этому поводу ответить.
15. 🅵🅾️🆇 528 12.11.18 17:49 Сейчас в теме
(10) Тут надо работу с потоками придумывать или разбирать ваш файл построчно/поблоково.

Вот 2 варианта для работы с текущей компонентой:
1) воспринимаете ваш файл как ТектовыйДокумент с заданым разделителем и читаете "построчно"
2) с помощью СтрНайти последовательно выгрызаете кусочки с заданым отступом

Ну или вы вовсе не правильно воспринимаете задачу, если это некий xml документ, то вам надо, наверное, смотреть в сторону XPath
17. Ershov Mikhail 12.11.18 17:59 Сейчас в теме
(15) Задача гепотетчиеская, из серии "Разобрать файл тех журнала" ... файл может быть большим, 30-50 ГБ.
Почему именно она ? потому что чаще приходится пользоваться Regex'ом именно для её решения.
В Bash - это делается просто, вопрос в том что если есть компонента, которая смогла бы это делать из 1С, минуя Bash - было бы круто и стало бы платформой для тех или иных решений. Но читать текстовый документ построчно и передавать его в ВК с методами Regexa, в рамках этой задачи - скорее всего сильно проиграет Bash'у по скорости и стабильности работы. Как бы исходя из этих мыслей и попросил пояснить возможно ли на текущий момент, используя эту ВК реализовать нечто подобное.
18. 🅵🅾️🆇 528 12.11.18 18:04 Сейчас в теме
(17) Почему проиграет то?
Не думаю, что кто то будет таким заниматься ради весьма необычной задачи.

Если у вас большой файл и его просто надо переварить компонентой, особо не заморачиваясь - делайте регламентной операцией или длительной задачей.
Если надо срочно и в кратчайшие сроки определенный файл "кушать", то и регэксп и 1с тут не годятся, тк проиграет по скорости специально написанной для этого дела утилите с нормальной асинхронностью и заточенный под поиск определенных паттернов.

ЗЫ: парсеров технологических журналов - вагон и маленькая тележка
19. Ershov Mikhail 12.11.18 18:11 Сейчас в теме
(18) Возможно я не совсем правильно понял заголовка статьи ...
Там написано : "Внешняя компонента для выполнения регулярных выражений".
Мои мысли: "Ух ты, круто т.е. нечто типа "grep DEADLOCK */*.log" можно выполнить из 1с ? ... было бы прикольно...
По факту я должен сначала все файлы через оперативку прогнать а потом пользоваться функционалом Regex'a.
+ Читать файл придётся тоже из 1С ... что (как мне кажется), будет медленнее чем выполнение этой же процедуры в Bash.
Хотя технически, ВК, созданная на сервере 1Сб уже имеет все права сервера 1С, вопрос только в описании функционала...
Это не в коем случае не претензия, это всего лишь мнение.
20. 🅵🅾️🆇 528 12.11.18 18:20 Сейчас в теме
(19) Почему быстрее или медленее то? Зачем вам целиком файл пихать в оперативу, вы всегда так делаете?

Вам надо:
0) подключить обработчик ожидания
1) подключить компоненту
2) в цикле читать файл либо построчно, либо в некий буфер
3) скармливать компоненте
4) после завершения цикла отключить компоненту
Опционально делать это в несколько потоков.
Оперативы потратите метр-другой.

Если мы говорим про написание "просмотр файлов в реальном времени", то это задача скорее для реактивной асинхронщины (нужно выводить данные в поток по мере чтения, не забывая выбрасывать из потока информацию находящуюся далеко от указателя пользователя), синхронно переваривать весь файл целиком чтоб показать пользователю кусочек - плохая идея (именно на этом сыпится большинство редакторов и ide, пытающихся синхронно обработать и разметить весь файл до конца).

Если вам не надо отображать пользователю в реальном времени - то парсите по ночам, как бог пошлет и не парьтесь.
MKFreeUser; +1 – Ответить
12. azhilichev 217 12.11.18 16:45 Сейчас в теме
(8) Уважаемый, а как вы иначе хотите? Чтобы компонента вам еще и файл читала? Отделяйте мух от котлет.

Автор, если эта компонента работает так, как описал в статье, мысленно жму руку!
13. Ershov Mikhail 12.11.18 16:48 Сейчас в теме
(12) Ну если бы компонента имела возможность читать файл, (А если немного обнаглеть то ещё и маску путей как это работает в Bash) был бы вообще огонь ... но для начала тоже неплохо, ничего против не имею ... это всего лишь идея к развитию проекта ...
Darklight; +1 –1 Ответить
26. Dmitryiv 169 14.11.18 10:22 Сейчас в теме
(8) А может не стоит файлы такого размера обрабатывать средствами 1С? Ну совсем не тот инстумент.
27. Ershov Mikhail 14.11.18 15:49 Сейчас в теме
(26) Создатели конфигурации ЦУП и ЦКК из Корпоративного пакета, считают иначе ... Они пошли дальше, не только парсят их в 1С, ещё и хранят их в РС ... в разобранном виде. На продуктивной БД размером в 1 ТБ, и 200 пользователей в онлайне - Операция "Анализ вызовов кластера" по ТЖ весит 250 Гб , при истории данных в полдня ...
В общем то я их 1Сом и не парсю, для этого используется Bash с Regex'ом. Т.к. это компонента как раз про Regex, думал что может тогда без Bash'a сразу из 1С можно пользоваться Regex'ом ... но видимо не сейчас, возможно когда-нибудь прогресс дойдёт и до полномасштабного Regex'а из 1С.
16. Infactum 320 12.11.18 17:56 Сейчас в теме
А зачем внутри компоненты все эти конвертации типов для linux, если под капотом все работает вокруг шаблонов std::basic_regex и std::basic_string, которые позволяют задать базовый тип (в случае компоненты WCHAR_T)?
22. KAV2 159 13.11.18 05:33 Сейчас в теме
(16) Конвертации лишние и их надо будет убрать. Я оставил это на развитие. Кстати, можно добавлять pull request-ы ;-)
starik-2005; +1 – Ответить
21. kraynev-navi 703 12.11.18 20:27 Сейчас в теме
(0) Вещь! Не делали сравнений по быстродействию с тем же популярным COMОбъект("VBScript.RegExp") ?
23. KAV2 159 13.11.18 05:42 Сейчас в теме
(21) VBscript быстрее, но там есть ещё пути для оптимизации. Не все оптимально сделано. Принципиально что уже сейчас компонента работает на несколько порядков быстрее чем реализация на 1С в конфигурации 1С:Translator.
kraynev-navi; +1 – Ответить
39. KAV2 159 18.12.18 17:31 Сейчас в теме
(21) В компоненте версии 5 теперь не все так однозначно со скоростью. Во первых, если вызывается метод один раз, и в него передать большой текст, то компонента теперь может обходить по скорости VBScript.RegExp, но вот если в цикле часто вызывать методы компоненты, передавая каждый раз небольшой текст для анализа, то VBScript.RegExp быстрее. Связано это с тем, что у платформы 1С высокие накладные расходы на вызов методов Native API внешней компоненты. Даже вызов пустого метода отрабатывает медленнее чем вызов метода COM сервера. Во всяком случае на платформах 8.3.12 и 8.3.13. Похоже что разработчик компоненты на это никак повлиять не может.
24. ayuplotnikov 14.11.18 09:51 Сейчас в теме
Отличная задумка! Успехов вам!
Подскажите, пожалуйста, как управлять флагами i, g, m?
29. KAV2 159 14.11.18 16:41 Сейчас в теме
(24) Честно сказать ни разу не пользовался подобными флагами. Надо будет изучить вопрос.
34. KAV2 159 17.11.18 20:57 Сейчас в теме
(24) В общем, реализация из стандартной библиотеки С++ не поддерживает эти флаги в синтаксисе регулярных выражений. Можно добавить установку этих флагов отдельно, если в них реальная есть потребность, либо за основу взять реализацию не стандартной библиотеки, а скажем boost.
35. ayuplotnikov 18.11.18 09:38 Сейчас в теме
(34) Конкретно для меня критически важен регистронезависимый режим.
Я сейчас в 1С использую VBScript.RegExp. У него эти параметры задаются через булевы свойства Global, IgnoreCase, Multiline. В std::regex - через аргумент конструктора. Существенной разницы между способами я не вижу.
Можно добавить необязательные аргументы к существующим методам или добавить метод, который устанавливает флаги. Все варианты обратно совместимы с текущей реализацией.
38. KAV2 159 18.12.18 17:26 Сейчас в теме
(24) Выложена новая версия компоненты, где кроме всего прочего добавлены свойства Global\ВсеСовпадения и IgnoreCase\ИгнорироватьРегистр.

Также, реализована возможность задавать модификаторы синтаксиса perl, описанные здесь (синтаксис отличается JavaScript) - https://www.regular-expressions.info/modifiers.html
starik-2005; ayuplotnikov; +2 – Ответить
25. Darklight 38 14.11.18 10:15 Сейчас в теме
Большое Вам спасибо. Компонента, конечно, замечательная - и я обязательно найду ей применение в своих проектах. А ещё, появление данной публикации, оказалось для меня, как нельзя кстати, я как раз делал свою первую Native компоненты С++ (я совсем не С++ программист) - и уже отчаялся - примеры/шаблоны с ИТС не компилировались, а если заставлял компилироваться - не подключались в 1С. Всё перепробовал. И другие компоненты скачивал - тоже либо не компилировались либо не подключались (на разных платформах и компьютерах и x86 и x64). Думал уже забить на это дело. И тут увидел эту публикацию - и О ЧУДО - она заработала - и на основе шаблона вашей компоненты я сделал свою - и она тоже заработала - АЛИЛУЯ! Но отличия в двух шаблонах так и не нашёл (кроме, разве что не был установлен у меня набор инструментов VS 2017 для XP, использовал набор VS 2013 для XP - но его установка и применение в старом проекте всё-равоно так и не решило проблему), хотя было ещё одно - внешние C++ SDK зависимости (cpp и h) у меня в старом проекте тянулись из каталога SDK версии 7.1, а вашем проекте из SDK версии 8.1 - где и как это настраивается я так и не нашёл (в настройках проекта каталоги в обоих проектах вели именно в SDK версии 7.1). А при применении SDK версии 7.1 с одним из примеров компоненты, скачанной в исходниках из интернета, вообще не компилировался и выдавал ошибку про термы которые "не известны" внутри этого SDK (но мой старый проект, как ни странно, всё-таки компилировался, но компонента не подключалась). В общем, как же это тяжко писать компоненты на VS C++ - спасибо Вам за то, что ваша, вовремя, подоспевшая публикация, помогла мне выбраться из этого тупика! Вот бы ещё разобраться как этот SDK в создаваемых в VS 2017 проектах настроить чтобы знать где же выбирается каталог SDK, откуда должны подтягиваться внешние зависимости (cpp и h).
KAV2; kraynev-navi; +2 – Ответить
30. KAV2 159 14.11.18 16:47 Сейчас в теме
(25) Спасибо большое за теплый отзыв! Кстати компонента, собранная на SDK 8 работает и на XP, по крайней мере с SP3 (кажется в одном из сервис паков расширялся формат исполняемых файлов).
120. leasing 5 06.04.22 13:57 Сейчас в теме
(25) В публикации ссылки на шаблон.
28. zakiap 14.11.18 15:58 Сейчас в теме
Похожа на RexV8 только работает медленнее, но зато есть исходники и работа по linux
31. KAV2 159 14.11.18 17:01 Сейчас в теме
(28) Да с производительностью есть куда расти, надеюсь поработать над этим в следующих версиях компоненты.
32. Darklight 38 15.11.18 11:03 Сейчас в теме
(28)
(31) Там в осуждении писали про нестабильную работу RexV8. Проверьте у себя регулярки из поста 62 и ещё нескольких более ранних постов от tormozit.
33. KAV2 159 16.11.18 22:44 Сейчас в теме
(32) Ну на указанных сценариях компонента не падает.
49. Trener 08.05.19 15:36 Сейчас в теме
(28)да, я тоже сразу подумал о RExV8 ,реально очень похоже. Вот только медленно все просто ужас(
50. KAV2 159 08.05.19 15:58 Сейчас в теме
(49) Относительно низкая скорость работы объясняется высокими накладными расходами на вызов методов внешней компоненты, это особенность работы текущих версий платформы. Если передавать большой объем данных за один вызов, тогда скорость работы должна быть на уровне, по крайнее мере точно быстрее чем VBScript.RegExp.
Данная компонента работает на несколько порядков быстрее реализации движка на языке 1С, и при этом доступна почти на всех платформах, включая Mac OS и Android.
36. KAV2 159 18.11.18 17:40 Сейчас в теме
Добавлена в список загрузок отдельным файлом, внешняя компонента, собранная для Mac OS ( тестировалась и собиралась на версии Sierra 10.12).
К сожалению загрузка компоненты из макета не работает (пока не разобрался в чем дело), поэтому компонента и выложена отдельно, без включения в общий архив, предназначенный для загрузки в макет.
Подключить компоненту можно с помощью метода ПодключитьВнешнююКомпоненту:

ПодключитьВнешнююКомпоненту("<Путь к файлу компоненты>/RegExMac64_4.so", "Component", ТипВнешнейКомпоненты.Native)
37. KAV2 159 18.12.18 17:18 Сейчас в теме
Новая версия компоненты - 5

Изменения в версии:
- переезд на boost::regex (за счет этого повышена стабильность работы)
- добавлено свойство Global\ВсеСовпадения
- добавлено свойство IgnoreCase\ИгнорироватьРегистр
- добавлено свойство Template\Шаблон
- добавлено свойство ErrorDescription\ОписаниеОшибки
- добавлено свойство ThrowExceptions\ВызыватьИсключения
- добавлена обработка исключений
- добавлен метод Version\Версия
- оптимизирована производительность
- потеряна совместимость с WindowsXP
starik-2005; +1 – Ответить
40. karpik666 4388 19.12.18 16:39 Сейчас в теме
Молодец, этого действительно не хватало, в своей разработке для работы в linux использовал обработку регулярок чисто кодом 1С, штука крутая, но скрость просто убивала.
42. KAV2 159 24.12.18 13:56 Сейчас в теме
Новая версия компоненты - 6

Изменения в версии:
- Добавлена поддержка наименований методов и свойств без учета рЕгИсТрА.
- Исправлена ошибка задвоения результатов, если установлен флаг Global под Linux или Mac OS.
- Исправлена утечка памяти под Linux или Mac OS.
43. KAV2 159 13.02.19 20:13 Сейчас в теме
Новая версия компоненты - 7

Изменения в версии:
- Исправлена утечка памяти при работе под Linux и MacOS
- Удалена зависимость (статическая, при линковке) от библиотеки iconv при работе под Linux и MacOS
- Удален лишний программный код и выполнена небольшая оптимизация.
- Уменьшен размер файла компоненты для MacOS
44. KAV2 159 14.02.19 17:08 Сейчас в теме
Новая версия компоненты - 8

Изменения в версии:
- Исправлены ошибки
- Оптимизация
45. KAV2 159 22.04.19 19:50 Сейчас в теме
Новая версия компоненты - 9

Изменения в версии:
- Исправлены ошибки
- Оптимизация
- Уменьшен размер файлов компоненты
46. KAV2 159 27.04.19 14:26 Сейчас в теме
Добавлен отдельным файлом тестовый архив внешних компонент для Android.
47. KAV2 159 05.05.19 19:15 Сейчас в теме
Добавлена отдельным файлом сборка для 64-битной версии Google Chrome под Linux
48. KAV2 159 06.05.19 12:39 Сейчас в теме
Добавлена сборка для Google Chrome под Windows.
51. GorDAn 29.05.19 23:25 Сейчас в теме
Компонента при обходе результата (ВсеСовпадения = Истина) пропускает пустые подгруппы. Из за этого непонятно, когда заканчивается одно совпадение и начинается другое. Можно настроить, чтобы выводились все группы?
52. KAV2 159 14.06.19 08:21 Сейчас в теме
(51) Нет, настроить требуемое поведение в текущей версии нельзя. Если можно, скинье пожалуйста пример шаблона и пример данных к которым этот шаблон применяется.
53. huxuxuya 409 25.07.19 13:16 Сейчас в теме
А в возвращаемом значении вы могли бы возвращать еще SubMatches?
54. KAV2 159 25.07.19 13:20 Сейчас в теме
(53) все найденные группы, включая вложенные возвращаются последовательно.
55. huxuxuya 409 25.07.19 14:41 Сейчас в теме
(54)не очень понимаю как этой последовательностью пользоваться... например

"яблоко красное и тыква черная и еще одно яблоко фиолетовое и еще одно яблоко белое"
яблоко[\s](\S+)


ожидаю что будет 3 найденных:
яблоко красное
яблоко фиолетовое
яблоко белое

и в каждом вхождении был бы цвет в SubMatches, но если он последовательно выводит то как предполагается использовать группировки?
В шаблоне искать сколько открытых и закрытых скобочек и после первого вывода отсчитывать их количество, что бы понять когда закончилась группа и началась строка поиска?
56. KAV2 159 25.07.19 18:06 Сейчас в теме
(55) Этот момент оставил на развитие. Если предложите вариант и удасться его реализовать то постараюсь оперативно тестовую сборку отправить. Ну и опять же это опенсорс, так что всегда можно доработать под свои нужды.
Более детально можно обсудить в личных сообщениях (или в gitter).

Как вариант:
Добавить пустой результат между группами, то есть:
яблоко красное
красное
(пустая строка в результате)
яблоко фиолетовое
фиолетовое
(пустая строка в результате)
яблоко белое
белое
(пустая строка в результате)
59. cprit 941 29.02.20 12:37 Сейчас в теме
(56) Предлагаю два варианта.
Второй на мой взгляд проще в использовании.

Первый вариант. Реализовать метод Выбрать(), который будет производить выборку в текущей группе. И обходить группу уже существующим методов следующий(). На 1С код по обходу примерно следующий будет

Рег.НайтиСовпадения("Hello world", "([A-Za-z]+)\s+([a-z]+)");

//Обходим MatchCollection
Пока Рег.Следующий() Цикл
ТекстMatch=Рег.ТекущееЗначение;

 //Обходим SubMatches
Рег.Выбрать();
Пока Рег.Следующий() Цикл
 ТекстSubMatch=Рег.ТекущееЗначение;
КонецЦикла;

КонецЦикла;
Показать


Второй вариант. Реализуем еще один метод СледующийПодчиненный(), Который будет обходить коллекцию SubMatches. Код в 1С по обходу примерно следующий

Рег.НайтиСовпадения("Hello world", "([A-Za-z]+)\s+([a-z]+)");

//Обходим MatchCollection
Пока Рег.Следующий() Цикл
ТекстMatch=Рег.ТекущееЗначение;

 //Обходим SubMatches
Пока Рег.СледующийПодчиненный() Цикл
 ТекстSubMatch=Рег.ТекущееЗначение;
КонецЦикла;

КонецЦикла;
Показать
60. KAV2 159 29.04.20 21:03 Сейчас в теме
(55)

Выложена тестовая сборка версии 11, где опционально добавлен новый метод обхода результата поиска. Подробнее - в описании изменений к новой версии.
61. etorpov 06.05.20 14:24 Сейчас в теме
(60)на пару недель пораньше б) благодаря 11 версии сократил костыльный код в 2 раза)
в 11 и 10 версии(в других не проверял) не работает свойство "ИгнорироватьРегистр" - всегда пишет "ошибка чтения значения" приходится переписывать немного строку шаблона
А так все ок, вроде:)
62. KAV2 159 06.05.20 15:37 Сейчас в теме
(61) Спасибо большое за фидбэк!

Ошибка с ИгнорироватьРегистр у меня не воспроизводиться.
Может быть в личных сообщениях спишемся и попробуем устранить проблему?
57. aleks_p99 16.09.19 20:53 Сейчас в теме
Полезный компонент.
Спасибо)
58. 5H1 27.02.20 07:11 Сейчас в теме
Здравствуйте. Как убрать сообщение "Внешняя компонента успешно установлена"?
65. KAV2 159 17.04.21 15:10 Сейчас в теме
(58)
Попробуйте такой код:
Если Не	ПодключитьВнешнююКомпоненту("ОбщийМакет.RegEx", "Component", ТипВнешнейКомпоненты.Native) Тогда
	УстановитьВнешнююКомпоненту("ОбщийМакет.RegEx");
	ПодключитьВнешнююКомпоненту("ОбщийМакет.RegEx", "Component", ТипВнешнейКомпоненты.Native);
КонецЕсли;
63. KAV2 159 31.12.20 17:23 Сейчас в теме
Новая версия компоненты - 11
Изменения в версии:

- Добавлен метод КоличествоВложенныхГрупп\SubMatchesCount

Метод возвращает количество групп (подгрупп\SubMatches) если в шаблоне были заданы группы, например, для шаблона ([A-Za-z]+)\s+([a-z]+) будет возвращено значение 2. Метод возвращает значение только после выполнения метода НайтиСовпадения \ Matches.

- Добавлен метод ПолучитьПодгруппу \ GetSubMatch (<ИндексПодгруппы>)

Метод возвращает строковое значение подгруппы из результатов поиска методом НайтиСовпадения \ Matches. У метода один параметр - Индекс группы, он задает индекс группы, который следует получить(доступны значения от 0 до КоличествоВложенныхГрупп - 1).

- У метода НайтиСовпадения \ Matches добавлен третий, необязательный параметр типа булево, включающий\отключающий иерархический обход результатов поиска.
Полный пример иерархического обхода:

Рег.НайтиСовпадения("Hello world", "([A-Za-z]+)\s+([a-z]+)", Истина); // Истина -  иерархический обход

Сообщить( Рег.Количество()); // 1 - всего один результат, а не 3 
Сообщить( Рег.КоличествоВложенныхГрупп()); // 2 - две подгруппы (submatches)

//Обходим MatchCollection
Пока Рег.Следующий() Цикл
Сообщить(Рег.ТекущееЗначение); // Hello world
Сообщить(Рег.ПолучитьПодгруппу(0)); // Hello
Сообщить(Рег.ПолучитьПодгруппу(1)); // world
КонецЦикла;
Показать

- Исправлено: на некоторых сборках Android не работали вызовы методов на кириллице

- Исправлен ряд ошибок и выполнена оптимизация.
64. KAV2 159 03.01.21 09:49 Сейчас в теме
Новая версия компоненты - 12
Изменения в версии:
- Исправлены ошибки.
66. unichkin 1627 25.04.21 14:36 Сейчас в теме
Добрый день. А где это можно проверять? Сейчас попробовал вместо com-объекта, разница по результатам поиска разительная. И не могу понять в чем проблема. И на сайте где я обычно отлаживаю регулярки https://regex101.com/ - ни в одной из сред исполнения данный результат не повторился.
67. KAV2 159 25.04.21 15:36 Сейчас в теме
(66) Ну во первых отличие может быть в дефолтных флагах. На regex101.com по дефолту включен флаг global (/g) - поиск всех вхождений, на компоненте по дефолту он выключен (устанавливается отдельным свойством см. описание) и выполняется поиск только первого вхождения.

Во вторых, если есть в шаблоне группы, то получение результата может отличаться, в зависимости от флага ИерархическийОбходРезультатов в функции НайтиСовпадения (см. описание выше). То есть результат будет зависеть от того, как осущетвляется обход.

В третьих, может отличаться и ситаксис используемого движка, на самом regex101.com доступно в данный момент 6 различных диалектов и они отрабатывают по разному. В текущей версии компоненты, используется библиотека boost::regex с perl совместимым синтаксисом, но даже несмотря на то, что разработчики этой библиотеки заявляют о совместимости с perl, все равно могут быть какие-то небольшие отличия с другими подобными реализациями.

На данный момент, в разработке переход на другой движок - PCRE2. И уже доступна тестовая сборка компоненты под Linux и Windows - https://github.com/alexkmbk/RegEx1CAddin/releases/tag/13.0
И по предварительным результатам можно сказать, что уже известные расхождения в реализации синтаксиса на этом движке отсутствуют (что не удивительно, ведь судя по всему на regex101.com используется таже библиотека).

Если у вас есть желание,можете написать мне в личку исходные данные для проверки (текст шаблона и текст в котором осуществляется поиск) может быть я смогу подсказать в чем проблема.
68. unichkin 1627 26.04.21 10:36 Сейчас в теме
(67)
Если у вас есть желание,можете написать мне в личку исходные данные для проверки (текст шаблона и текст в котором осуществляется поиск) может быть я смогу подсказать в чем проблема.

Добрый день, спасибо за ответ. Свою проблему уже решил ручным парсингом, воспроизводить нет смысла.
69. KAV2 159 23.05.21 17:45 Сейчас в теме
Новая версия компоненты - 13

Изменения в версии:

- Осуществлен переход на библиотеку PCRE2 версии 10.36, вместо boost::regex. За счет этого, улучшена совместимость с Perl синтаксисом регулярных выражений, а также во многих сценариях существенно улучшена производительность;

- Добавлен метод MatchesJSON\НайтиСовпаденияJSON(<Текст для анализа>, [<Регулярное выражение>]) - возвращает результат в виде JSON текста. Метод позволяет значительно быстрее получить и обработать результат поиска (за счет минимизации вызовов методов через NativeAPI);

- Добавлено свойство FirstIndex - аналог свойства FirstIndex из VBScript.RegExp;

- Добавлено свойство Multiline\Многострочный (По умолчанию = Истина, на движке boost::regex режим Multiline был по умолчанию и его нельзя было отключить);

- Добавлен синоним Test для метода IsMatch.

ВНИМАНИЕ! При переходе с версии 12, рекомендуется проверить работу ваших текущих регулярных выражений на предмет совместимости с новой версией. Поскольку в версии 13 используется новый движок, могут быть расхождения в результатах работы регулярных выражений, поскольку работа boost:regex и PCRE2 не идентична.
70. tormozit 7393 23.05.21 18:08 Сейчас в теме
Эта компонента (версия 13) протестирована и используется в подсистеме "Инструменты разработчика" https://www.hostedredmine.com/issues/889592 в ОС Linux и при выполнении кода на сервере.
svbel85; sashocq; KAV2; +3 – Ответить
71. Dzenn 936 05.06.21 01:15 Сейчас в теме
Всё впечатление от компоненты испортили модальные окна и синхронные вызовы (((
72. KAV2 159 05.06.21 13:01 Сейчас в теме
(71) Так используйте асинхронные вызовы, любая внешняя компонента может быть подключена и использована в асинхронном режиме. Можете воспользоваться готовой подсистемой для этого (правда там на текущий момент не самая актуальная версия компоненты) - https://github.com/cpr1c/RegEx1C_cfe/
73. Dzenn 936 05.06.21 13:02 Сейчас в теме
(72) хмм... попробую, спасибо. Но что делать с модальным окном "Компонента подключена" при подключении?
74. KAV2 159 05.06.21 13:04 Сейчас в теме
(73) Используйте асинхронные методы для установки и подключения: НачатьУстановкуВнешнейКомпоненты, НачатьПодключениеВнешнейКомпоненты.
75. Dzenn 936 05.06.21 13:05 Сейчас в теме
(74) хорошо, попробую, спасибо!
76. Dzenn 936 05.06.21 13:09 Сейчас в теме
(74) Установил успешно, подключил успешно, но НайтиСовпадения всё равно исполняется синхронно, и это я уже не пофиксю, видимо (
77. KAV2 159 05.06.21 13:18 Сейчас в теме
(76) Используйте перед каждым названием метода приставку НачатьВызов<ИмяМетода>, например, НачатьВызовНайтиСовпадения, перед получением свойства НачатьПолучение<ИмяСвойства>, перед установкой свойства НачатьУстановку<ИмяСвойства>.
Но надо понимать что в этом случае, первым параметром должен передаваться объект ОписаниеОповещения.

Поскольку это стандартный функционал платформы и работает одинаково для всех внешних компонент, то этот момент в документации не описан.
jake_qwert; +1 – Ответить
78. Dzenn 936 05.06.21 13:20 Сейчас в теме
(77) Спасибо огромное за просвещение! Попробую!
79. Dzenn 936 05.06.21 13:29 Сейчас в теме
(77) Попробовал, как ни крути, а без синхронных вызовов сложновато получается — под каждый вызов функции компоненты, будь то НайтиСовпадения(), Количество(), ТекущееЗначение() нужно писать отдельную процедуру под оповещение
80. KAV2 159 05.06.21 13:38 Сейчас в теме
(79) А попробуйте метод НачатьВызовНайтиСовпаденияJSON, он возвращает в качестве результата строку в формате JSON, которую легко можно распарсить следующим образом:
jsonreader = new JSONReader;
jsonreader.SetString(Результат);
res = ReadJSON(jsonreader, False); 
For Each Item In res Do
	Message(Item.Value); 	// тут Item содержит все свойства + массив подгрупп
EndDo; 


С таким подходом асинхронных вызовов будем меньше, при этом скорость работы даже выше, поскольку вызов методов через NativeAPI довольно медленный.

Правда ReadJSON не доступен на вебклиенте, только на тонком.
jake_qwert; +1 – Ответить
81. Dzenn 936 05.06.21 13:40 Сейчас в теме
(80) да, отлично, спасибо за наводку!
119. KAV2 159 19.01.22 08:16 Сейчас в теме
(77) Кстати, начиная с версии платформы 8.3.18 доступен механизм асинхронности с помощью обещаний, что сильно упрощает асинхронные вызовы, см. пример в описании выше.
jake_qwert; +1 – Ответить
82. Andreynikus 1438 30.07.21 10:17 Сейчас в теме
При подключении на сервере возникает ошибка "Тип не определен (AddIn.Component.RegEx)"
83. KAV2 159 30.07.21 16:59 Сейчас в теме
(82) А метод ПодключитьВнешнююКомпоненту возвращает Ложь? Если так, то рекомендую проверить какой именно комплект компонент используете для сервера, для сервера под Windows и Линукс необходимо использовать комплект RegEx1CAddin_13.zip.
84. Andreynikus 1438 13.08.21 18:13 Сейчас в теме
(83) да именно он и используется, т.к. у всех остальных клиентов работает кроме одного. Сейчас уже проверить нет возможности, заменил компоненту на VBшную через COM, она хоть и медленнее но стабильнее.
85. QbeeQ 17 02.09.21 22:56 Сейчас в теме
Как заставить компоненту действительно игнорировать регистр?
Прикрепленные файлы:
86. tormozit 7393 02.09.21 23:02 Сейчас в теме
(85) Какая платформа (Win/Linux)? У меня на Windows работает эта опция. Правда я устанавливаю ее через латинский вариант - IgnoreCase
87. QbeeQ 17 02.09.21 23:04 Сейчас в теме
Windows 10 Pro x64 Версия 21H1
1С:Предприятие 8.3 (8.3.18.1289) x86
88. QbeeQ 17 02.09.21 23:05 Сейчас в теме
Увы, смена языка не помогает.
Может быть имеет значение то, что шаблон поиска я задаю через свойство, а не при вызове метода "НайтиСовпадения"?
90. QbeeQ 17 03.09.21 00:11 Сейчас в теме
(88) Нашёл причину!
Оказывается имеет значение в каком порядке устанавливаются значения свойств объекта.
Шаблон поиска нужно задавать после установки флагов поиска
И такая конструкция в результат вернёт Ложь

	Ищейка = Новый("AddIn.Component.RegEx");
	Ищейка.Pattern = "слово";
	Ищейка.Global = Истина;
	Ищейка.Multiline = Ложь;
	Ищейка.IgnoreCase = Истина;
	
	Результат = Ищейка.Test("Слово");
91. tormozit 7393 03.09.21 06:42 Сейчас в теме
92. KAV2 159 03.09.21 08:30 Сейчас в теме
(90) Так сделано из соображений производительности.

При установке шаблона выполняется его компиляция с учетом установленных флагов, если флаги устанавливаются после компиляции шаблона, то по понятным причинам они уже не влияют на работу текущего регулярного выражения.

Если компиляцию делать непосредственно в момент выполнения, то потеряется возможность выноса компиляции регулярного выражения за пределы цикла. То есть сейчас можно сначала скомпилировать шаблон, а потом уже в цикле выполнять поиск по одному и тому же скомпилированному шаблону.

Если же делать компиляцию каждй раз как устанавливается какой-либо флаг, то мы тут тоже потеряем в производительности.
jake_qwert; +1 – Ответить
93. QbeeQ 17 03.09.21 08:36 Сейчас в теме
(92) А при смене флага нельзя шаблон перекомпилировать?
Ну или исключение бросить, мол нарушен порядок установки свойств.
А то в заблуждение вводит.
94. KAV2 159 03.09.21 08:39 Сейчас в теме
(93) Надо подумать об этом, спасибо за обратную связь!
96. tormozit 7393 03.09.21 12:23 Сейчас в теме
(92) Чтобы не терять скорость, добавь метод Prepare() и флаг AutoPrepare (по умолчанию Истина). При отключенном флаге пусть пользователь сам решает когда вызывать Prepare(), а при включенном вызывай при любом изменении свойств объекта компоненты.
89. QbeeQ 17 02.09.21 23:49 Сейчас в теме
Ещё момент. Не знаю можно ли считать это ошибкой компоненты...
Я ей случайно число вместо строки для анализа скормил и она всю 1С уронила.
Я конечно понимаю, что сам дурак, но зачем же так жестоко?
95. KAV2 159 03.09.21 08:42 Сейчас в теме
(89) Не удалось воспроизвести, вы не могли бы скинуть код с помощью которого воспроизводится ошибка? (можно в личку или в issue на гитхабе)
97. starik-2005 3309 15.09.21 13:30 Сейчас в теме
98. starik-2005 3309 01.11.21 17:35 Сейчас в теме
Затестил компоненту, она работает медленнее VBScript.RegExp в 3-4 раза. Что я делаю не так?
100. starik-2005 3309 01.11.21 22:52 Сейчас в теме
(99) интересно написано. Я использовал последнюю версию с гита и последнюю вин10 на виртуалбоксе, серверный контекст файловой базы. Один паттерн на 2000 номенклатурных позиций. Суть паттерна - проверка наличия двух английских слов подряд. VBscript.RegExp справляется с этим за 16 мс, последняя версия этой либы - за 48-78 мс (разброс). 78 мс было 3 раза, один раз 61 мс и один раз 48 мс.

Я думаю, что дело в паттерне RegExp, который находится в однажды установленном свойстве, а в эту компоненту приходится паттерн передавать каждый раз. Если сделать паттерн, устанавливаемый однажды, то это может весьма хорощо сказаться на производительности, т к. большинмтво кейсов использования регулярок - это одинипаттерн для охулиарда строк...
101. KAV2 159 04.11.21 06:37 Сейчас в теме
(100) Свойство Шаблон тоже можно задать один раз и затем он будет использоваться при каждом вызове НайтиСовпадения.
Тесты показывают что компонента работает раза в 2 быстрее VBscript.RegExp в серверном контексте в клиент-серверном режиме, в клиентском режиме и в режиме файловой базы, компонента работает в большинстве сценариев медленне в 2-4 раза. Есть возможность несколько повысить скорость работы компоненты, используя метод НайтиСовпаденияJson, в этом случае, за счет уменьшения количество вызовов по протоколу NativeAPI получается существенно быстрее (но все равно медленне чем VBscript), даже при том, что приходится перегонять это все в Json и обратно.

Главная проблема здесь в медленной работе протокола NativeAPI, это ограничение платформы.
102. starik-2005 3309 05.11.21 20:41 Сейчас в теме
(101)
Главная проблема здесь в медленной работе протокола NativeAPI, это ограничение платформы.
А что конкретно в нем медленно? И что вообще за "протокол" такой?

На сколько я знаю, натиа АПИ вызывает функцию, преобразуя имя в номер, который потом обернут этим case в "вызватькакфункцию". Предположу, что "мудрые" 1С-неги каждый раз дергают "получитьномерметодапоимени", потом уже дергают "вызватькакфункцию". Но при небольшом количестве методов скорость не должна сильно падать из-за этого, тем более вроде как у вас там map юзается для списка методов и свойств, поиск в котором достаточно шустр.

Я так вижу, что основные тормоза могут быть при копировании каждого параметра с типом P_WSTR, переданного из 1С, из которого через видимо конструктор базовой строки создается стринг, потом преобразуется в строку, которую можно скормить функции регулярок. А у нас каждый раз две строки передаются - шаблон и сама строка. Если шаблон передавать в отдельное свойство (например. свойство "шаблон"), а Test вызывать с одной строкой, то это может повысить производительность, т.к. не придется копировать строку с шаблоном и преобразовывать ее для функции регулярки - достаточно сделать это один раз при установке свойства "Шаблон".

PS: я тут протестил Test с параметром по умолчанию и с двумя параметрами. Так вот с двумя параметрами работает быстрее. Видимо не дергается дополнительно функция проверки параметров. Надо будет попробовать добавить к вашим методам еще один - Тест2, у которого будет один параметр. Потестирую - отпишусь потом.

PSS: У меня очень нехорошие цифры получились - 8,4 сек за 1000 * 2000 раз для RegExp и 28,2/30,4 сек для тех же данных с Вашей ВК.
105. KAV2 159 06.11.21 10:52 Сейчас в теме
(102) Установку свойства Шаблон и прочих свойств необходимо вынести за пределы цикла.
106. starik-2005 3309 06.11.21 15:07 Сейчас в теме
(105)
Установку свойства Шаблон и
Ну как бы не совсем я даун вроде бы )))

&НаСервере
Процедура ПроверитьREGEXНаСервере()
	ПодключитьВнешнююКомпоненту("ОбщийМакет.RegEx", "Component", ТипВнешнейКомпоненты.Native);
	            
	Рег = Новый("AddIn.Component.RegEx");
	
	Запрос = Новый Запрос("ВЫБРАТЬ Наименование ИЗ Справочник.Номенклатура");
	Т = ТекущаяУниверсальнаяДатаВМиллисекундах();
	ТАБ = Запрос.Выполнить().Выгрузить();
	Рег.Шаблон = "([A-Za-z]+)\s+([a-z]+)"; // перед циклом, ежу понятно, но с паттерном еще медленнее (((
	Для А = 1 ПО 100 Цикл 
		Н = 0;
		Для Каждого Ст ИЗ ТАБ Цикл Если Рег.Test( Ст.Наименование ) Тогда Н = Н + 1; КонецЕсли; КонецЦикла;
	КонецЦикла;
	Сообщить(ТекущаяУниверсальнаяДатаВМиллисекундах() - Т);
	Сообщить(Н);
	
	Рег = Новый COMОбъект("VBScript.RegExp");
	Рег.Pattern = "([A-Za-z]+)\s+([a-z]+)";
	
	Т = ТекущаяУниверсальнаяДатаВМиллисекундах();
	Для А = 1 ПО 100 Цикл 
		Н = 0;
		Для Каждого Ст ИЗ ТАБ Цикл Если Рег.Test(Ст.Наименование) Тогда Н = Н + 1; КонецЕсли; КонецЦикла;
	КонецЦикла;
	Сообщить(ТекущаяУниверсальнаяДатаВМиллисекундах() - Т);
	Сообщить(Н);

	Тест = Неопределено;
	
	ПроверитьСтроку("1",".*([A-Za-z]+)\s+([a-z]+).*", Тест);
	
	Т = ТекущаяУниверсальнаяДатаВМиллисекундах();
	Для А = 1 ПО 100 Цикл 
		Н = 0;
		Для Каждого Ст ИЗ ТАБ Цикл Попытка Тест.TestItem = Ст.Наименование; Н = Н + 1; Исключение КонецПопытки; КонецЦикла;
	КонецЦикла;

	Сообщить(ТекущаяУниверсальнаяДатаВМиллисекундах() - Т);
	Сообщить(Н);

КонецПроцедуры
Показать

Даже в одну строку не помогло...

затраты на вызов сопоставимы с вызовом метода VBscript.RegExp который при этом еще что-то делает
Это, кстати, странно очень.

Я последнюю компоненту пилил для стохастического "анализа" (Монте-Карло, достаточно простой вариант). Там просто через свойства сделал, метод расчета вызывается в общем-то один - Calculate(). 100к строк (по 6 значений) через свойства грузятся достаточно быстро (через "ЗаполнитьЗначенияСвойств( Компонента, СтрокаТаблицыФормы )", после вызывается метод "Компонента.ДобваитьДанные()" ), но тоже не сказал бы, что совсем. Зато расчет занимает 12 секунд на ноуте и 16 секунд на сервере (30к итераций на 7,3к данных).

Надо будет посмотреть, что там в какой последовательности дергается и где сократить....

Вообще, у народа кейсы есть, например, такие - есть куча платежек, для которых нужно по тексту назначения платежа подобрать параметры (выдрать договор, если есть, его параметры, прочие атрибуты). Если это творить на сервере, то RegExp от мелкомягких действительно сильно начинает тормозить (ориентировочно на порядок). При том обычный 1С-ный механизм проверки паттерна через XDTO как раз на порядок медленнее, что как бы намекает, что разницы нет...

Ны и вообще серверные компы работают несказанно медленнее десктопов в части однопоточной производительности (может это только Ынтел)...
107. KAV2 159 06.11.21 16:08 Сейчас в теме
(106) Если на сервере и данных много то это скорее всего клиент-серверная база, а на ней компонента однозначно быстрее чем VBScript.RegExp.

через свойства грузятся достаточно быстро


А сравнивали скорость работы с альтернативной технологией, реализованной через COM сервер?
108. starik-2005 3309 06.11.21 20:39 Сейчас в теме
(107)
реализованной через COM сервер
Я редко живу в винде, так что даже не пытаюсь.
109. starik-2005 3309 08.11.21 13:47 Сейчас в теме
(107)
а на ней компонента однозначно быстрее чем VBScript.RegExp.
И это действительно оказалось так:
RegEx (3 815)
2 из 1 479
VBScript.RegExp (6 986)
2 из 1 479
XDTO (17 667)
2 из 1 479
Чуть менее, чем в два раза быстрее...
103. starik-2005 3309 05.11.21 21:17 Сейчас в теме
(101)
PSSS:
Я тут решил затестить то, что писал когда-то давно про регулярки без ВК. Вот общие результаты на 100 * 2000 тестов (сервер файловой):
3 064 мс - эта компонента
47 - количество совпадений
===
842 мс - RegExp
47 - количество совпадений
===
8 890 мс - XDTO (к паттерну были добавлены ".*" в начале и конце строки), объект был закеширован (см код ниже)
47 - количество совпадений

Объект ХДТО был закеширован и вызывался так:
Попытка
	Тест.TestItem = Ст.Наименование;
	Н = Н + 1;
Исключение
КонецПопытки;

Таким образом я делаю вывод, что в файловых базах вполне можно обойтись и без внешних компонент при поиске строк, удовлетворяющих паттерну.
104. KAV2 159 06.11.21 09:43 Сейчас в теме
(103) Ну в определенных сценариях да, конечно можно XDTO использовать, но там насколько я понимаю можно реализовать только функцию Test из VBscript.RegExp, то есть получить результат типа булево. Если же требуется вернуть найденные строки или еще и с подгруппами, или выполнить замену текста или скажем выполнить настройку поиска (учет регистра, глобальный поиск, режим обработки многострочного текста), то тут XDTO не получается использовать. Потом, по поводу производительности многое зависит от сценария, какая регулярка, какой текст обрабатывается, используется ли функция НайтиСовпаденияJson.

Native API много времени тратит именно на вызов метода из внешней компоненты, при этом, даже если в самой компоненте поставить заглушку, затраты на вызов сопоставимы с вызовом метода VBscript.RegExp который при этом еще что-то делает (на клиенте или на файловой базе).
110. kislitsin 15.11.21 10:29 Сейчас в теме
Коллеги приветствую.
Может кто подскажет, мне нужно удалять из текста определенные слова в принципе работает такая конструкция: ИскомоеСлово(?=[\|\s.,:;'"!?]) но проблема в том что если у меня строка заканчивается на ИскомоеСлово , то по такому шаблону компонента не находит данного слова. На одном из онлайн тестеров регулярных выражений мне удалось подобрать такой шаблон : ИскомоеСлово(?=[\|\s.,:;'"!?]|$) и он работает в онлайн тестере, а почему то при использовании компоненты эта конструкция не работает. Видимо есть особенности реализации, подскажите как можно решить мою задачу используя вашу компоненту ?
111. KAV2 159 27.11.21 21:30 Сейчас в теме
(110)
и он работает в онлайн тестере, а почему то при использовании компоненты эта конструкция не работает


Ну на текущей версии компоненты шаблон ИскомоеСлово(?=[\|\s.,:;'"!?]|$) работает, для текста, который оканчивается на искомое слово.

Можно проверить на этом сервисе, поскольку он использует тот же движок PCRE2: https://regex101.com/r/Ldjqk6/1
112. VVi3ard 52 27.12.21 23:28 Сейчас в теме
(99), (95)
Подскажите пожалуйста не как не могу понять почему не работает шаблон:
https://regex101.com/r/TZU3ZU/2

Как видно в тестере работает нормально (PCRE2) версия компоненты 13.7.

	Рег = Новый("AddIn.Component.RegEx");
	Рег.ВсеСовпадения = Истина;
	Рег.Многострочный = Истина;
	Рег.IgnoreCase = Истина;
	Рег.ВызыватьИсключения = Истина;
	Рег.Шаблон = "([^\W]\w+\.(?:(?!\w )[^\s]\w+){1,})";

	СтрокаПоиска = "ВЫБОР
		|КОГДА Договор.ВидОперации = ЗНАЧЕНИЕ(Перечисление.навВидыОперацийДоговор.СоглашениеОПеременеСтороны)
		|		И НЕ Договор.ПрежнийАгент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
		|		И НЕ Договор.АгентскийДоговорОсновной = ЗНАЧЕНИЕ(Документ.Договор.ПустаяСсылка)
		|	ТОГДА Договор.АгентскийДоговорОсновной.НомерДоговора";

		СписокГрупп = Новый СписокЗначений;
		Рег.НайтиСовпадения(СтрокаПоиска,, Ложь);
		Пока  Рег.Следующий() Цикл
			СписокГрупп.Добавить(Рег.ТекущееЗначение);
		КонецЦикла; 
Показать


При этом со строкой:
SELECT
		|CASE Contract.Vid = VALUE(ENUMERATION.VidContract.Soglash)
		|		AND NOT Contract.LastAgent= VALUE(Catalog.Contragent.Empty)
		|		AND NOT Contract.ContractMain = VALUE(Doc.Contract.Empty)
		|	ТОГДА Contract.ContractMain.NumberContractа


работает, такое впечатление что какие то проблемы с параметром \u unicode.
113. KAV2 159 28.12.21 11:28 Сейчас в теме
(112) В PCRE2 по дефолту директивы \W и \w распространяются только на символы ASCII

Позже планирую добавить опцию для включения обработки всего Юникода для этих директив.

На текущий момент могу предложить тестовую сборку (только под Windows) где эта опция всегда включена:
https://github.com/alexkmbk/RegEx1CAddin/releases/tag/14.0

Или вместо директив \W и \w можно использовать альтернативные, например \p{L}
114. VVi3ard 52 28.12.21 12:15 Сейчас в теме
(113)
Да альтернативный вариант замена \w на [а-яА-Я_]. (это не совсем равноценная замена, но мне нужно было именно так)

Огромное спасибо за тестовую сборку, и за проделанную работу. Кстати с VBA такая же проблема, только решить её заменой \w на [а-яА-Я_] не получилось (но не сильно долго разбирался).
115. KAV2 159 30.12.21 11:14 Сейчас в теме
(114) Выложена тестовая версия компоненты 14.2, с добавленным свойством "UCP" типа булево (по умолчанию равно Ложь). Оно включает обработку всех символов Unicode для директив \W и \w.

https://github.com/alexkmbk/RegEx1CAddin/releases/tag/14.2
116. KAV2 159 14.01.22 11:52 Сейчас в теме
Новая версия компоненты - 14

Изменения в версии:

- Добавлено новое свойство UCP типа булево (по умолчанию равно Ложь). Оно устанавливает флаг PCRE2_UCP в методе pcre2_compile, что включает обработку всех символов Unicode для директив \W и \w (а не только символов ASCII).

- Исправлено падение платформы, при передачи в качестве текста шаблона или текста для поиска дробных числовых значений.

- Исправлена неработающая очистка свойства ОписаниеОшибки.
SerVer1C; +1 – Ответить
117. SerVer1C 1146 14.01.22 16:22 Сейчас в теме
(116) Круть! А то приходилось костылями обыгрывать проблему для Unicode.
118. KAV2 159 19.01.22 08:10 Сейчас в теме
Описание дополнено примером в асинхронном режиме, с использованием обещаний (доступно с версии 8.3.18).
jake_qwert; +1 – Ответить
121. leasing 5 06.04.22 13:59 Сейчас в теме
Ссылки на шаблон проекта в публикации.
122. madonov 287 14.07.23 08:59 Сейчас в теме
Поймал странный глюк.
Задаю текст шаблона (любым способом, см скрин).

А он не задается. В реквизите пустая строка.

Шаблон нетривиальный:
(?<!одновременный |одновременных |одновременного |удаленный |удаленных |удаленного |беспрепятственный |ПЕРЕДАВАЕМОЙ ИНФОРМАЦИИ.*предоставление |ПЕРЕДАВАЕМОЙ ИНФОРМАЦИИ.*предоставлять |ПЕРЕДАВАЕМОЙ ИНФОРМАЦИИ.*предоставления к ним )доступ


Но я проверяю шаблон онлайн через https://wtools.io/ru/check-regex-online - шаблон корректный, находит по тексту что требуется (отсекая лишнее).


Ага... Вижу - ОписаниеОшибки "The regexp template is not specified.: lookbehind assertion is not fixed length". Похоже перебор с длиной строки...
Прикрепленные файлы:
123. KAV2 159 14.07.23 09:13 Сейчас в теме
(122)
Здравствуйте, дело не в длине строки, дело в самом шаблоне, движок PCRE не поддерживает данный шаблон:
https://stackoverflow.com/questions/3796436/whats-the-technical-reason-for-lookbehind-assertion-must-be-fixed-length-in-r

Можно проверить на https://regexr.com/ выбрав движок PCRE (по умолчанию там движок JavaScript)
Там будет выдана такая же ошибка.
124. madonov 287 14.07.23 09:40 Сейчас в теме
(123) Спасибо за быстрый ответ.
убираю из шаблона ".*" - ошибок нет.
Возвращаю - ошибки есть.

Похоже, что при обратном поиске нельзя использовать ".*".

Придется ограничиться менее точным шаблоном
(?<!одновременный |одновременных |одновременного |удаленный |удаленных |удаленного |беспрепятственный |предоставление |предоставлять |предоставления к ним )доступ
125. madonov 287 14.07.23 10:46 Сейчас в теме
Со вложенными скобками тоже беда.
Вот по такому шаблону
(Адаптац(ия|ию|ей) и сопровожден(ие|ия|ию) экземпляр(ов|а) Систем|Услуг( |и )по адаптации и сопровожден(ие|ия|ию)|Сопровожден(ие|ия|ию) адаптированн(ых|ого)( | Исполнителем )экземпляр(ов|а) Систем)


https://regexr.com/ на движке PCRE находит по тексту 2 совпадения.

В то время как компонента возвращает 88 совпадений, в числе которых " ", "ия", "ию", "ов", "а"... то есть скобки внутри скобок игнорируются.
126. KAV2 159 14.07.23 12:39 Сейчас в теме
(125)
скиньте пожалуйста текст в котором выполняется поиск по шаблону.
127. tormozit 7393 14.07.23 16:04 Сейчас в теме
(125) А где проверочный текст то?
128. madonov 287 15.07.23 04:45 Сейчас в теме
(126)
(127)

В Хабаровске уже конец рабочего дня был.
Выложу пример уже в понедельник.
129. madonov 287 17.07.23 03:08 Сейчас в теме
Параметры ВК:
ВсеСовпадения Истина
ИгнорироватьРегистр Истина
Многострочный Истина

Далее код:
Шаблон = "(Адаптац(ия|ию|ей) и сопровожден(ие|ия|ию) экземпляр(ов|а) Систем|Услуг( |и )по адаптации и сопровожден(ие|ия|ию)|Сопровожден(ие|ия|ию) адаптированн(ых|ого)( | Исполнителем )экземпляр(ов|а) Систем)";

ТекстДокумента = "Сопровождение адаптированных Исполнителем экземпляров Систем";

RegExp.Matches(ТекстДокумента, Шаблон);


RegExp.Count() возвращает 11 совпадений.

При обходе получаю 6 уникальных результатов:
"" (пустая строка)
"ие"
"ых"
"ов"
" Исполнителем "
"Сопровождение адаптированных Исполнителем экземпляров Систем"

https://regexr.com/ в режиме PCRM с тем же набором флагов возвращает 1 результат "Сопровождение адаптированных Исполнителем экземпляров Систем", и этот результат совпадает с моими ожиданиями.

Изначально я думал, что вложенные скобки игнорируются ВК только при просмотре назад (из-за этого парой постов выше я выкладывал очень громоздкий шаблон), но отладка показала, что вложенные скобки игнорируются и при относительно простом поиске совпадений по шаблону.

PS. Проверил как указанный пример отработает VBScript.RegExp - результат аналогичный regexr.com.
130. tormozit 7393 17.07.23 07:36 Сейчас в теме
(129)
Получил 1 результат. Тест:
СвойствоФрол = "(Адаптац(ия|ию|ей) и сопровожден(ие|ия|ию) экземпляр(ов|а) Систем|Услуг( |и )по адаптации и сопровожден(ие|ия|ию)|Сопровожден(ие|ия|ию) адаптированн(ых|ого)( | Исполнителем )экземпляр(ов|а) Систем)";
Вычислитель = Новый ("AddIn.ВычислительРегВыражений.RegEx");
Вычислитель.Global = Истина;
Вычислитель.Multiline = Истина;
Вычислитель.IgnoreCase = Истина;
Вычислитель.Pattern = СвойствоФрол;
Вычислитель.ВызыватьИсключения = Истина;
РезультатJSON = Вычислитель.MatchesJSON(ТекстГдеИскать);
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(РезультатJSON);
Вхождения = ПрочитатьJSON(ЧтениеJSON, Ложь);
Показать

А внутри этого результата, как и полагается 10 групп
Прикрепленные файлы:
131. madonov 287 17.07.23 09:05 Сейчас в теме
(130)

Возможно, что я не до конца разобрался в синтаксисе.

Пример использования ВК из статьи:
Рег.НайтиСовпадения("Hello world", "([A-Za-z]+)\s+([a-z]+)", Истина);

Сообщить(Рег.Количество()); // 1 - всего один результат 
Сообщить(Рег.КоличествоВложенныхГрупп()); // 2 - две подгруппы (submatches)

Пока Рег.Следующий() Цикл 
Сообщить(Рег.ТекущееЗначение); // Hello world 
Сообщить(Рег.ПолучитьПодгруппу(0)); // Hello 
Сообщить(Рег.ПолучитьПодгруппу(1)); // world 
КонецЦикла;
Показать


Результат будет содержать 1 элемент и 2 подгруппы, а вывод будте таким же:

Hello world
Hello
world


Собственно я обхожу результат, получаю именно "ТекущееЗначение", помещаю его в ТЗ с результатами.
RegEx1CAddin.Matches(СтрокаДокумента.ТекстДокумента, СтрокаСлова.Слово);
Пока RegEx1CAddin.Следующий() Цикл
	Стр = ТЗ.Добавить();
	Стр.СловоДляРаскрашивания = RegEx1CAddin.ТекущееЗначение;
КонецЦикла;
ТЗ.Свернуть("СловоДляРаскрашивания"); //оставляю только уникальные результаты


В моем понимании группы не должны попадать в результат. Да и метод "Количество()" должен возвращать количество результатов, а не групп.

PS. Метод MatchesJSON не пробовал, использовал Matches.
132. KAV2 159 17.07.23 10:26 Сейчас в теме
(129)
RegExp.Count() возвращает 11 совпадений.


Чтобы получить результат как на https://regexr.com/, необходимо третьим параметром в методе Matches указать значение Истина. По умолчанию (без указания третьего параметра), метод Matches "возвращает" результат в виде массива всех результатов, включая подгруппы, для того, чтобы результат был иерархическим (то есть возвращается основной результат, а подгруппы получаются с помощью метода GetSubMatch) и необходим третий параметр в значении Истина.
133. madonov 287 18.07.23 05:38 Сейчас в теме
(132) спасибо за разъяснения.
135. Suker86 87 20.10.25 22:36 Сейчас в теме
(132) Добрый вечер.
Спасибо большое за вашу работу!

Мне посоветовали вашу компоненту, что бы адаптировать под Linux мою небольшую разработку на VBScript.RegExp.
Я протестировал, выполнил по 5 раз разбор базы УНФ, RegExp`ом и вашей компонентой, тестировал на Windows 64 бит, технологическая платформа 8.3.27.1719.

У меня получилось что VBScript.RegExp чуть быстрей, примерно на 10%, в среднем вышло VBScript.RegExp = 47 минут, вашей = 53 минуты.

Но тесты неточные, т.к. мой разбор подразумевает поиск файлов и запись регистра. А это всегда разное время даже на одной компоненте,
В случае чистого тестирования нужно просто циклом тысячу раз прогнать какой нибудь сложный текст. А у меня задача была практическая, количество выбранных экспортных функций и процедур и их вызовов у меня полностью совпала и время выполнения плюс минус аналогичное между вашей компонентой и регэкспом.

Так что зачёт !

От себя я могу добавить пару замечаний:
1) В "НайтиСовпадения" 3-ий параметр по умолчанию я бы поставил в ИСТИНА.

2) В VBScript.RegExp получаем массив Matches, который мы в дальнейшем перебираем:
Matches = RegExp.Execute(Текст);
Для Каждого StrMatches Из Matches Цикл
и объявленный экземпляр RegExp мы можем уже использовать по другому назначению, например
RegExp.Replace

у вас:
RegExp.НайтиСовпадения(Текст, ШаблонЗаменыСкобок, Истина);
Пока RegExp.Следующий() Цикл

Пока я цикл не переберу, объявленный экземпляр RegExp я не могу использовать так:
RegExp.Заменить

приходится создавать еще один экземпляр:
RegExp2 = Новый("AddIn.Component.RegEx");

и уже в нём выполнять замену:
RegExp2.Заменить

Я ведь всё правильно понял ? ) Если да, то не совсем удобно с экземплярами. Было бы удобнее выгрузить в массив найденные вхождения.
136. KAV2 159 21.10.25 18:50 Сейчас в теме
(135) Здравствуйте!
По скорости работы. В контексте сервера VBScript.RegExp работает существенно медленее, но так или иначе основное замедление здесь дает не сам алгоритм внешней компоненты, а интерфейс NativeAPI, он сам по себе довольно медленный, даже медленее чем интерфейс COM.

По вызову метода Заменить внутри цикла. Не помню, тестировал ли я этот момент, но по идее должно работать без необходимости создания еще одного экземпляра, т.е. внутри цикла можно вызывать метод Заменить.
Еще, есть вариант использования метода НайтиСовпаденияJSON, он возвращает результат в виде строки в формате JSON (есть описание этого метода выше), он позволяет получить результат и уже вести его обработку как вам удобно, в том числе используя ранее созданный объект компоненты.
Однако метод НайтиСовпаденияJSON, был добавлен не для этого, а как ни странно для скорости работы, поскольку он позволяет минимизировать количество вызовов методов и свойств из внешней компоненты по протоколу NativeAPI.

Но я бы рекомендовал использовать встроенные в платформу методы для работы с регулярными выражениями, если не нужен их вызов в тонком клиенте (где они на текущий момент не поддерживаются).
137. Suker86 87 21.10.25 20:49 Сейчас в теме
(136) Добрый вечер.

Да, по методу "заменить" я немного наврал, действительно работает.
Изначально хотел написать про необходимость создания нескольких экземпляров при вложенном "НайтиСовпадения" внутри "НайтиСовпадения", предполагал, что и "заменить" не будет работает.

НайтиСовпаденияJSON на досуге проверю, как будет время.

Встроенные в платформу 1С методы не рассматривал по причине того, что поиск выполняется до первого найденного элемента, а не возвращает массив с найденным.
Ограничения текущей реализации рег выражений на 1С:
Отсутствует поддержка подвыражений (Submatches). Если необходимо получить несколько результатов в виде коллекции, то нужно вызывать функцию поиска в цикле, каждый раз передавая ей увеличенную начальную позицию поиска.
138. KAV2 159 21.10.25 21:32 Сейчас в теме
(137) Поддержка Submatches есть в платформенной реализации, у объекта РезультатПоискаПоРегулярномуВыражению есть метод ПолучитьГруппы (доступен начиная с 8.3.23).
Но когда я выпустил эту компоненту, тогда еще вообще не было поддержки регулярных выражений в платформе.
139. Suker86 87 22.10.25 12:06 Сейчас в теме
(138) пробовал я ПолучитьГруппы у РезультатПоискаПоРегулярномуВыражению, массив пустой.
В описании к СтрНайтиПоРегулярномуВыражению указано: находит первое вхождение регулярного выражения в исходной строке. Проверьте сами, может я что то не так делаю )
140. Suker86 87 27.10.25 22:41 Сейчас в теме
(139) Да, действительно, можно.
Функция называется:
СтрНайтиВсеПорегулярномуВыражению
возвращает массив результатов поиска
Видимо статьи, который я читал, были все старые, а в справке я что то не догадался посмотреть )
134. ImHunter 351 03.08.23 21:11 Сейчас в теме
Обертка для методов компоненты.
#Область ИспользованиеКомпонентыRegEx

////////////////////////////////////////////////////////////­////////////////////////////////////////////
// Методы для работы с компонентой разбора текста регулярным выражением.
// Компонента сохранена в виде общего макета RegEx. Для ее использования, необходимо сохранить
// содержимое макета (zip-архив) в справочник ВнешниеКомпоненты.  
//
// Ссылки:
// https://infostart.ru/1c/tools/940766/
// https://github.com/alexkmbk/RegEx1CAddin/releases
////////////////////////////////////////////////////////////­/////////////////////////////////////////////

// Создает экземпляр компоненты RegEx. При необходимости, подключает компоненту.
// 
// Возвращаемое значение:
//  Произвольный - Созданная компонента.
//
Функция РегСоздать() Экспорт   
	
	// Вероятно, нужно модифицировать метод, чтобы можно было использовать асинхронное подключение на клиенте.
	
	ИмяКомпоненты = "AddIn.Component.RegEx";
	
	Попытка
		Компонента = Новый(ИмяКомпоненты);
	Исключение  
		Подключено = РегПодключитьСинхронно();
		Если Не Подключено Тогда
			ВызватьИсключение(СтрШаблон(НСтр("ru = 'Не удалось подключить компоненту %1'"), ИмяКомпоненты));
		КонецЕсли; 
		Компонента = Новый(ИмяКомпоненты);
	КонецПопытки;      
	
	Возврат Компонента;
	
КонецФункции  

Функция РегПодключитьСинхронно() Экспорт   
	#Если ТонкийКлиент Или ВебКлиент Тогда
	УстановитьВнешнююКомпоненту("ОбщийМакет.RegEx");
	#КонецЕсли
	Возврат ПодключитьВнешнююКомпоненту("ОбщийМакет.RegEx", "Component", ТипВнешнейКомпоненты.Native);
КонецФункции  

// Метод выполняет поиск в переданном тексте по переданному регулярному выражению.
//  Результатом выполнения метода будет массив результатов поиска.
//  
//  Для того, чтобы получить результаты выполнения метода (массив результатов), необходимо
//  выполнить метод Следующий/Next(), и после этого, в свойстве ТекущееЗначение/CurrentValue будет доступно
//  значение текущей подгруппы результата выполнения (текущий элемент массива результатов).
//  Идея похожа на обход результата запроса.
//  
//  Пример:
//  Рег.НайтиСовпадения("Hello world", "([A-Za-z]+)\s+([a-z]+)");
//  Пока Рег.Следующий() Цикл
//  	Сообщить(Рег.ТекущееЗначение);
//  КонецЦикла;
//
// Параметры:
//  Компонента						 - Произвольный	 - Компонента RegEx
//  ТекстДляАнализа					 - Строка		 - Анализируемый текст
//  РегулярноеВыражение				 - Строка		 - Регулярное выражение. Если не задано, то берется из свойства Шаблон.
//  ИерархическийОбходРезультатов	 - Булево		 - Определяет то, как будет осуществлен обход результатов.
//  		По умолчанию = Ложь. Если ИерархическийОбходРезультатов=Ложь, тогда каждый элемент массива результатов поиска - найденная подгруппа поиска.
//  		Если подгрупп нет, то массив будет содержать один элемент - найденную строку.
//  		Если ИерархическийОбходРезультатов=Истина, тогда, каждый элемент массива результатов поиска будет содержать
//  		только найденную строку, а значение подгруппы при их наличии, можно будет получить методом ПолучитьПодгруппу.
//
Процедура РегНайтиСовпадения(Компонента, 
		ТекстДляАнализа, РегулярноеВыражение = Неопределено, ИерархическийОбходРезультатов = Ложь) Экспорт
	Компонента.НайтиСовпадения(ТекстДляАнализа, РегулярноеВыражение, ИерархическийОбходРезультатов)
КонецПроцедуры 

// Выполняет переход к следующему найденному фрагменту - аналогично методу выборки Следующий().
//
// Параметры:
//  Компонента	- Произвольный	 - Компонента RegEx
// 
// Возвращаемое значение:
//  Булево - Удалось ли перейти к следующему найденному фрагменту.
//
Функция РегСледующий(Компонента) Экспорт
	Возврат Компонента.Следующий();
КонецФункции

// Возвращает количество результатов поиска, после выполнения метода РегНайтиСовпадения
//
// Параметры:
//  Компонента	- Произвольный	 - Компонента RegEx
// 
// Возвращаемое значение:
//  Число - Количество результатов поиска
//
Функция РегКоличество(Компонента) Экспорт 
	Возврат Компонента.Количество();
КонецФункции                        

// Возвращает количество групп (подгрупп\SubMatches) если в шаблоне были заданы группы.
//  Например, для шаблона ([A-Za-z]+)\s+([a-z]+) будет возвращено значение 2.
//  Метод возвращает значение только после выполнения метода РегНайтиСовпадения
//
// Параметры:
//  Компонента	- Произвольный	 - Компонента RegEx
// 
// Возвращаемое значение:
//  Число - количество групп
//
Функция РегКоличествоВложенныхГрупп(Компонента) Экспорт
	Возврат Компонента.КоличествоВложенныхГрупп();
КонецФункции  

// Возвращает строковое значение подгруппы из результатов поиска методом НайтиСовпадения.
//
// Параметры:
//  Компонента		 - Произвольный	 - Компонента RegEx
//  ИндексПодгруппы	 - Число		 - Задает индекс группы, который следует получить(доступны значения от 0 до КоличествоВложенныхГрупп - 1)
// 
// Возвращаемое значение:
//  Строка - Строковое значение подгруппы из результатов поиска методом РегНайтиСовпадения
//
Функция РегПолучитьПодгруппу(Компонента, ИндексПодгруппы) Экспорт
	Возврат Компонента.ПолучитьПодгруппу(ИндексПодгруппы);	
КонецФункции  

// Выполняет поиск в переданном тексте по переданному регулярному выражению.
//  Результатом выполнения метода будет строка в формате JSON представляющая собой массив структур.
//  Метод позволяет значительно быстрее получить и обработать результат поиска
//  (за счет минимизации вызовов методов через NativeAPI).
//
// Параметры:
//  Компонента			 - Произвольный	 - Компонента RegEx
//  ТекстДляАнализа		 - Строка		 - Анализируемый текст
//  РегулярноеВыражение	 - Строка		 - Регулярное выражение. Если не задано, то берется из свойства Шаблон.
// 
// Возвращаемое значение:
//  Строка - Строка в формате JSON представляющая собой массив структур
//
Функция РегНайтиСовпаденияJSON(Компонента, ТекстДляАнализа, РегулярноеВыражение = Неопределено) Экспорт
	Возврат Компонента.НайтиСовпаденияJSON(ТекстДляАнализа, РегулярноеВыражение);
КонецФункции  

// Заменяет в переданном тексте часть, соответствующую регулярному выражению, значением, переданным параметром ЗначениеДляЗамены.
//
// Параметры:
//  Компонента			 - Произвольный	 - Компонента RegEx
//  ТекстДляАнализа		 - Строка		 - Анализируемый текст
//  РегулярноеВыражение	 - Строка		 - Регулярное выражение. Если не задано, то берется из свойства Шаблон.
//  ЗначениеДляЗамены	 - Строка		 - Значение для замены
// 
// Возвращаемое значение:
//  Строка - Строка с замененными фрагментами
//
Функция РегЗаменить(Компонента, ТекстДляАнализа, РегулярноеВыражение = Неопределено, ЗначениеДляЗамены = Неопределено) Экспорт
	Возврат Компонента.Заменить(ТекстДляАнализа, РегулярноеВыражение, ЗначениеДляЗамены);
КонецФункции 

// Делает проверку на соответствие текста регулярному выражению.
//
// Параметры:
//  Компонента			 - Произвольный	 - Компонента RegEx
//  ТекстДляАнализа		 - Строка		 - Анализируемый текст
//  РегулярноеВыражение	 - Строка		 - Регулярное выражение. Если не задано, то берется из свойства Шаблон.
// 
// Возвращаемое значение:
//  Булево - Возвращает значение Истина если текст соответствует регулярному выражению
//
Функция РегСовпадает(Компонента, ТекстДляАнализа, РегулярноеВыражение = Неопределено) Экспорт
	Возврат Компонента.Совпадает(ТекстДляАнализа, РегулярноеВыражение);
КонецФункции  

// Возвращает номер версии компоненты в виде строки.
//
// Параметры:
//  Компонента	 - Произвольный	 - Компонента RegEx
// 
// Возвращаемое значение:
//  Строка - Номер версии компоненты в виде строки
//
Функция РегВерсия(Компонента) Экспорт 
	Возврат Компонента.Версия();
КонецФункции 

// Получает или устанавливает свойство компоненты.
//  Если Задано значение параметра Значение (<>Неопределено), то происходит установка значения соответствующего свойства.
//  Однако, режим можно задавать директивно, параметром УстановитьЗначение. Если передать Булево, то это явно укажет,
//  что необходимо выполнить - прочитать или установить значение.
//
// Параметры:
//  Компонента			 - Произвольный			 - Компонента RegEx
//  ИмяСвойства			 - Строка				 - Имя свойства. Варианты:
//		*ВсеСовпадения	- Булево	- Если установлено в Истина, то поиск будет выполняться по всем совпадениям, а не только по первому.
//		*Многострочный	- Булево	- Если установлено в Истина, то началом строки считаются также и символы перевода строки.
//			Значение по умолчанию: Истина.
//		*ИгнорироватьРегистр	- Булево	- Если установлено в Истина, то поиск будет осуществляться без учета регистра.
//			Значение по умолчанию: Ложь.                                                    
//		*Шаблон			- Строка	- Задает регулярное выражение которое будет использоваться при вызове методов компоненты, 
//			если в метод не передано значение регулярного выражения.  
//			Значение по умолчанию: пустая строка. 
//		*FirstIndex		- Число		- Аналог свойства FirstIndex из VBScript.RegExp. 
//			Возвращает индекс (начинается с 0) первого символа найденного текста в исходной строке.
//		*UCP			- Булево	- Свойство устанавливает флаг PCRE2_UCP в методе pcre2_compile, 
//			что включает обработку всех символов Unicode для директив \W и \w (а не только ASCII).
//			Значение по умолчанию: Ложь.
//		*ОписаниеОшибки	- Строка	- Содержит текст последней ошибки. Если ошибки не было, то пустая строка.
//			Значение по умолчанию: пустая строка.
//		*ВызыватьИсключения	- Булево	- Если установлена в Истина, то при возникновении ошибки, 
//			будет вызываться исключение, при обработке исключения, текст ошибки можно получить
//			из свойства ErrorDescription\ОписаниеОшибки. 
//		*ТекущееЗначение	- Строка	- Текущее значение найденного фрагмента при выполнении метода РегСледующий().
//  Значение			 - Произвольный, Неопределено	 - Устанавливаемое значение
//  УстановитьЗначение	 - Булево, Неопределено			 - Режим установки/чтения свойства.
// 
// Возвращаемое значение:
//  Произвольный, Неопределено - Если это установка свойства, то возвращается Неопределено.
//
Функция РегПолучитьУстановитьСвойство(Компонента, ИмяСвойства, Значение = Неопределено, УстановитьЗначение = Неопределено) Экспорт
	
	Результат = Неопределено;
	
	Если ТипЗнч(УстановитьЗначение)=Тип("Булево") Тогда
		ТребуетсяУстановитьЗначение = УстановитьЗначение;
	Иначе     
		ТребуетсяУстановитьЗначение = Значение<>Неопределено;
	КонецЕсли;

	Если ТребуетсяУстановитьЗначение Тогда 
		Компонента[ИмяСвойства] = Значение;
	Иначе 
		Результат = Компонента[ИмяСвойства];
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

#КонецОбласти // ИспользованиеКомпонентыRegEx
Показать
madonov; tormozit; +2 – Ответить
Для отправки сообщения требуется регистрация/авторизация