• Stars
    star
    165
  • Rank 228,906 (Top 5 %)
  • Language
    C
  • License
    The Unlicense
  • Created about 6 years ago
  • Updated 11 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

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

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С"