Monday, July 13, 2015

1C & REGEX Как упростить себе жизнь

Много времени экономит Regex, очень много, до него код моих программ превращался в монстроидальным и занимавшим не одну сотню строчек. Так что плюсы в нем очень и очень, опишу основные процедуры и функции которые упрощают и ускоряют мне работу.
Вот мои глобальные процедуры
//Простой возврат
Функция RegExp(Знач тСтрока,Паттерн, MultiLine = Истина, Global = Истина, IgnoreCase = Истина) Экспорт //Возвращает первое вхождение
 RegExp = Новый COMОбъект("VBScript.RegExp");
 тСтрока = Строка(тСтрока);
 RegExp.MultiLine = MultiLine; // истина — текст многострочный, ложь — одна строка 
 RegExp.Global = Global; // истина — поиск по всей строке, ложь — до первого совпадения 
 RegExp.IgnoreCase = IgnoreCase; // истина — игнорировать регистр строки при поиске  
 RegExp.Pattern = Паттерн;
 Matches=RegExp.Execute(Строка(тСтрока));
 Если RegExp.Test(тСтрока) тогда
  Возврат Matches.Item(0).SubMatches.Item(0);
 КонецЕсли;
 Возврат Неопределено;
КонецФункции

//Возврат в массив
Функция RegExpМассив(Строка,Паттерн, MultiLine = Истина, Global = Истина, IgnoreCase = Истина) Экспорт 
 RegExp = Новый COMОбъект("VBScript.RegExp");
 
 RegExp.MultiLine = MultiLine; // истина — текст многострочный, ложь — одна строка 
 RegExp.Global = Global; // истина — поиск по всей строке, ложь — до первого совпадения 
 RegExp.IgnoreCase = IgnoreCase; // истина — игнорировать регистр строки при поиске  
 RegExp.Pattern = Паттерн;
 Matches=RegExp.Execute(Строка);
 возМассив = Новый Массив;
 Если RegExp.Test(Строка) тогда
  Для н=0 по Matches.Count-1 Цикл 
   Для х=0 по Matches.Item(н).SubMatches.Count-1 Цикл
    возМассив.Добавить(Matches.Item(н).SubMatches.Item(х));
   КонецЦикла;
  КонецЦикла;
  Возврат возМассив
 КонецЕсли;
 Возврат возМассив;
КонецФункции

//Возврат в таблицу значений
Функция RegExpТаблицаЗначений(Строка,Паттерн, MultiLine = Истина, Global = Истина, IgnoreCase = Истина, КвоКолонок=0) Экспорт
 RegExp = Новый COMОбъект("VBScript.RegExp");
 Тбл = Новый ТаблицаЗначений;
 Если КвоКолонок=0 тогда
  КвоКолонок = СтрЧислоВхождений(Паттерн,"(");
 КонецЕсли;
 Для х=1 по КвоКолонок Цикл
  Тбл.Колонки.Добавить("К"+х);
 КонецЦикла;
 RegExp.MultiLine = MultiLine; // истина — текст многострочный, ложь — одна строка 
 RegExp.Global = Global; // истина — поиск по всей строке, ложь — до первого совпадения 
 RegExp.IgnoreCase = IgnoreCase; // истина — игнорировать регистр строки при поиске  
 RegExp.Pattern = Паттерн;
 Matches=RegExp.Execute(Строка);
 //возМассив = Новый Массив;
 Если RegExp.Test(Строка) тогда
  Для н=0 по Matches.Count-1 Цикл 
   НоваяСтрока = Тбл.Добавить();
   Для х=0 по Matches.Item(н).SubMatches.Count-1 Цикл
    //возМассив.Добавить(Matches.Item(н).SubMatches.Item(х));
    НоваяСтрока["К"+(х+1)]=Matches.Item(н).SubMatches.Item(х);
   КонецЦикла;
  КонецЦикла;
  Возврат Тбл
 КонецЕсли;
 Возврат Тбл;
КонецФункции

//Замена
Функция RegExpRepalce(Pattern, НачальнаяСтрока,ЗаменяемаяСтрока) Экспорт
 
 RegExp = Новый COMОбъект("VBScript.RegExp");
 //СтруктураФайлов = Новый СписокЗначений;
 RegExp.MultiLine = Истина; // истина — текст многострочный, ложь — одна строка 
 RegExp.Global = Истина; // истина — поиск по всей строке, ложь — до первого совпадения 
 RegExp.IgnoreCase = Истина; // истина — игнорировать регистр строки при поиске  
 RegExp.Pattern = Pattern; 
 ВозвращаемаяСтрока = RegExp.Replace(НачальнаяСтрока,ЗаменяемаяСтрока);
 
 //Matches=RegExp.Execute(НачальнаяСтрока);
 //Если RegExp.Test(НачальнаяСтрока) тогда
 // ВозвращаемаяСтрока = Matches.Item(0).SubMatches.Item(0)+Matches.Item(0).SubMatches.Item(1)+HTMLподпись+Matches.Item(0).SubMatches.Item(2);
 // Возврат СтрЗаменить(ВозвращаемаяСтрока,"<%br%>",Символы.ПС);
 //КонецЕсли;
 
 Возврат ВозвращаемаяСтрока;
КонецФункции

//Проверка
Функция RegExpTest(Строка,Паттерн, MultiLine = Истина, Global = Истина, IgnoreCase = Истина) Экспорт 
 RegExp = Новый COMОбъект("VBScript.RegExp");
 
 RegExp.MultiLine = MultiLine; // истина — текст многострочный, ложь — одна строка 
 RegExp.Global = Global; // истина — поиск по всей строке, ложь — до первого совпадения 
 RegExp.IgnoreCase = IgnoreCase; // истина — игнорировать регистр строки при поиске  
 RegExp.Pattern = Паттерн;
 //Matches=RegExp.Execute(Строка); 
 Возврат RegExp.Test(Строка);
 
КонецФункции


No comments:

Post a Comment