Git Product home page Git Product logo

alexkmbk / regex1caddin Goto Github PK

View Code? Open in Web Editor NEW
173.0 13.0 32.0 91.09 MB

Native API component for executing regular expressions on 1C: Enterprise platform / Внешняя Native API компонента для выполнения регулярных выражений на платформе 1С:Предприятие 8

License: The Unlicense

C++ 34.34% CMake 1.96% Makefile 0.45% C 58.92% Batchfile 0.01% 1C Enterprise 3.78% Java 0.53%

regex1caddin's Introduction

Join the chat at https://gitter.im/RegEx1CAddin/Lobby

RegEx1CAddin

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

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

  • Windows 32bit
  • Windows 64bit
  • Linux 32bit
  • Linux 64bit
  • MacOS 64bit
  • Android ARMv7-A
  • Android x86-64
  • Google Chrome (Linux, Windows)

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

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

  • Под 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");
		
		Пока Истина Цикл
			Результат = Ждать Рег.СледующийАсинх();   
			
			Если НЕ Результат.Значение Тогда
				Прервать;        
			КонецЕсли;  
			
			Результат = Ждать Рег.ПолучитьТекущееЗначениеАсинх();
			Сообщить(Результат);    
			
		КонецЦикла; 
	КонецЕсли; 
	
КонецПроцедуры

Связанный проект - Подсистема "Кроссплатформенные регулярные выражения в 1С"

regex1caddin's People

Contributors

alexkmbk avatar artbear avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

regex1caddin's Issues

Не работают флаги поиска если их задавать после установки шаблона

Шаблон поиска нужно задавать после установки флагов поиска
И такая конструкция в результат вернёт Ложь

    Ищейка = Новый("AddIn.Component.RegEx");
    Ищейка.Pattern = "слово";
    Ищейка.Global = Истина;
    Ищейка.Multiline = Ложь;
    Ищейка.IgnoreCase = Истина;
    
    Результат = Ищейка.Test("Слово");

Свойство ОписаниеОшибки заполняется в какой то странной кодировке

Свойство ОписаниеОшибки содержит например текст
T h e r e g e x p t e m p l a t e i s n o t s p e c i f i e d . : u n m a t c h e d c l o s i n g p a r e n t h e s i s : : T h e r e g e x p t e m p l a t e i s n o t s p e c i f i e d . : u n m a t c h e d c l o s i n g p a r e n t h e s i s : : T h e r e g e x p t e m p l a t e i s n o t s p e c i f i e d . : u n m a t c h e d c l o s i n g p a r e n t h e s i s : : T h e

изображение
изображение

При выводе в окно сообщений такого текста появляется только буква "Т"

Запрос функции: Именованные группы

Привет!

Я недавно обнаружил ваш проект и нашел его очень полезным. Очень круто, спасибо большое.
Однако, насколько я понимаю, в текущей версии (14.2) не поддерживаются именованные группы. Есть ли возможность добавить их поддержку?

Аварийное завершение программы при попытке анализировать несовместимый тип

Если вместо строки попытаться проанализировать число, то компонента вызовет аварийное завершение программы
Неплохо было бы в данной ситуации привести несовместимый тип к текстовому представлению или, хотя бы, вызвать исключение.
падает 32хразрядный клиент 8.3.18 на 64хразрядной винде.
Шаблон выполнялся в файловой базе на сервере в фоновом задании.
Значение получено из ячейки Екселевсеого файла.
Пример могу дать только вечером.

Ошибка в методе НайтиСовпадения

При передаче в метод длинного текста (пробовал на 500 символах) клиент падает!
Очень прошу пофиксить! Разработка очень нужна в жизни!%)

Падение на Linux на 22 платформе (всех)

Падение очень интересное - сервер перезагружаем, компонента подключается успешно, все хорошо.
Делаем первый вызов - все работает отлично.
Делаем второй - устанавливаются аттрибуты Global и т.д., а вот на вызове уже метода сравнения - падает.
Делаем третий раз - или выдается ошибка "Error calling constructor (AddIn.Component.RegEx)"

If AttachAddIn("CommonTemplate.addfun_RegExp", "Component") Then
		Regex = New("AddIn.Component.RegEx");

или зависает 1С. И все. Причем - установка компоненты отрабатывает.

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

Сейчас каждый вызов метода компоненты приходится заворачивать в попытку и перевыбрасывать исключение с передачей описания ошибки их свойства ОписаниеОшибки. Это довольно неудобно. Хотелось бы выброс исключения из самой компоненты с указанием описания ошибки без необходимости перевыброса в коде 1С.

Доступность на ВебКлиенте

Есть ли способ установить данную компоненту в ВебКлиенте? Получаю вот такое сообщение при вызове:
НачатьУстановкуВнешнейКомпоненты(Новый ОписаниеОповещения("КомпонентаRegExУстановлена", НПR), "ОбщийМакет.RegEx");
image
При этом на тонком клиенте всё работает.

При многократном поиске выражения "{1}" размножается описание ошибки

Создал объект компоненты и много раз вызывал поиск по некорректному шаблону "{1}". Каждый раз я получал описание ошибки со все большим числом повторов текста. Видимо где то не очищается описание ошибки при генерации исключения в компоненте.

{Обработка.ирОболочкаРегВыражение.МодульОбъекта(116)}: The regexp template is not specified.: : quantifier does not follow a repeatable item: : : : : : The regexp template is not specified.: : quantifier does not follow a repeatable item: : : : : : The regexp template is not specified.: : quantifier does not follow a repeatable item: : : : : : The regexp template is not specified.: : quantifier does not follow a repeatable item: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : The regexp template is not specified.: : quantifier does not follow a repeatable item: : : : : : The regexp template is not specified.: : quantifier does not follow a repeatable item: : : : : : The regexp template is not specified.: : quantifier does not follow a repeatable item: : : : : : The regexp template is not specified.: : quantifier does not follow a repeatable item: : : : : : The regexp template is not specified.: : quantifier does not follow a repeatable item

Ошибка при установке шаблона "\(.*?\)"

Присваиваю свойству Pattern значение \(.*?\)
В свойстве "ОписаниеОшибки" появляется
: : unrecognized character follows : : : unrecognized character follows : : : unrecognized character follows : : : unrecognized character follows \

Не метод а функция Совпадает \ IsMatch \ Test?

Вы пишите, что "Совпадает \ IsMatch \ Test(<Текст для анализа>, [<Регулярное выражение>])"
при этом указываете, что возвращает значение. Тогда это не метод, а функция!


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

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

Совместимость с VBScript

  1. Есть ли понимание, насколько эта реализация вычисления регулярных выражений совместима с VBScript ?
  2. Можно ли дополнить объектную модель компоненты избыточными элементами для быстрого подключения компоненты к большому коду, опирающемуся на объектную модель VBScript? Приложил пример
    Clip_208849.txt

info.xml для БСП ВнешниеКомпаненты

<?xml version="1.0" encoding="utf8"?>
<info>
	<progid>RegEx</progid>
	<name>RegEx1CAddin</name>
	<version>1.10.1</version>
</info>

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

image

Не верно отрабатывает регулярка.

Есть регулярка \<(?!Auto)[a-zA-z]+\s?.?[0-9a-zA-Z]+\>
Работает вот так:
image
Но тут, увы, регулярка выбирает абсолютно все слова, разделяя их пробелом, причем ей все равно на теги.
Это баг, или я что то не то делаю?

Сборка не пошла

В среде: Win10, VS2022

Сборка начата…
1>------ Сборка начата: проект: RegEx, Конфигурация: Debug x64 ------
1>cl : командная строка warning D9035: использование параметра "Gm" нежелательно, он будет удален в следующих выпусках
1>stdafx.cpp
1>cl : командная строка warning D9035: использование параметра "Gm" нежелательно, он будет удален в следующих выпусках
1>StrConv.cpp
1>json.cpp
1>AddInNative.cpp
1>C:\Users\evgen\source\repos\RegEx1CAddin-master\AddInNative.cpp(38,27): warning C4311: приведение типов: усечение указателя из "IComponentBase *" в "long"
1>C:\Users\evgen\source\repos\RegEx1CAddin-master\AddInNative.cpp(38,27): warning C4302: приведение типов: усечение из "IComponentBase *" к "long"
1>C:\Users\evgen\source\repos\RegEx1CAddin-master\AddInNative.cpp(197,5): warning C4267: аргумент: преобразование из "size_t" в "unsigned long"; возможна потеря данных
.......... и так далее, Затем
1>dllmain.cpp
1> Создается библиотека C:\Users\evgen\source\repos\RegEx1CAddin-master\bind64\RegExWin64.lib и объект C:\Users\evgen\source\repos\RegEx1CAddin-master\bind64\RegExWin64.exp
1>AddInNative.obj : error LNK2019: ссылка на неразрешенный внешний символ pcre2_compile_16 в функции "private: struct pcre2_real_code_16 * __cdecl CAddInNative::GetPattern(struct _tVariant const *)" (?GetPattern@CAddInNative@@AEAAPEAUpcre2_real_code_16@@PEBU_tVariant@@@z).
1>AddInNative.obj : error LNK2019: ссылка на неразрешенный внешний символ pcre2_code_free_16 в функции "public: virtual __cdecl CAddInNative::~CAddInNative(void)" (??1CAddInNative@@UEAA@XZ).

Пожалуйста, подскажите. Опыт небольшой в проектах такого рода, фактически проект использую для изучения темы 1С внешние компоненты и освоения VS и С++ (очень-очень давно опыт с С был), сам не докопаюсь до причины, видимо.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.