Версия для печати темы (https://pro1c.org.ua/index.php?s=2a44156cf6de90f9b18f96daa6f642cf&showtopic=67190)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Строка шаблона для поиска регулярного выражения

Автор: AnryMc 02.03.23, 12:38

Добрый день!

Не могу собрать в мозгах шаблон для RegExp.Pattern

Ситуация: есть куча номенклатуры (название вноситься как в накладной поставщика), поэтому куча элементов по сути одно и тоже, но с разными названиями...

Например:
Болт 10 * 5 мм.
Болт 10,0 х 5.0 mm
БОЛТ 10Х5,0мм
bolt 10/5 mm
...
И куча прочих вариантов...

Задача отбор динамического списка где ищется:

Два числа (могут быть дробными с разделителем . или ,)
Между ними укр. х eng. x (возможно в верхнем регистре), ещё возможны знаки * и / - этот "разделитель" может (или нет) отделятся от чисел пробелами...
После второго числа через пробел (или без пробела) следует "мм" или "mm" (возможно в верхнем регистре)

Помогите с созданием шаблона для поиска RegExp.Pattern

Спасибо


P.S. Предполагается, что пользователь вводит два числа, например: 10 и 5
Нужно отобрать всю номенклатуру с данными парамерами...

Автор: zay 02.03.23, 12:57

У меня есть опыт такого решения:

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

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

То-есть это в основном административное решение. Запретить забивать справочник номенклатуры "мусором"

Автор: AnryMc 02.03.23, 17:01

zay @ Сегодня, 12:57 * ,


Полностью своя конфа...
В день до 1500 наименований с "оЧеПатками" как у поставщика...
а потом нужно во всём этом "мусоре" найти нужные типоразмеры...
так что только RegExp

Нужна строка патерна для такой ситуации:

ПервоеЧисло введенное пользователем
+ может быть разделитель дробной части «.» или «,» если есть разделитель, то должна быть ещё одна цифра
+ может быть (или не быть) один или два разделителя (пробел)
+ знак «х» укр., «x» eng. (возможно в верхнем регистре) или «*» или «/»
+ может быть (или не быть) один или два разделителя (пробел)
+ ВтороеЧисло введенное пользователем
+ может быть разделитель дробной части «.» или «,» если есть разделитель, то должна быть ещё одна цифра
+ может быть (или не быть) один или два разделителя (пробел)
+ текст «мм» (укр.) или «mm» (eng.) (возможно в верхнем регистре)





Для чисел (второе 1-но разрядное) без десятичных

\d{1,3}\s{0,2}[xх\*]\s{0,2}\d\s{0,2}[mм][mм

Решение:

&НаКлиенте
Процедура ВыполнитьПоиск(Команда)
    
    ВыполнитьПоискНаСервере();
    
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    ЗаполнитьШаблоны();
    
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьШаблоны()
    
    Объект.СтрокаПоиска = "Болт 10,2 * 5.1 Mm. и прочее";
    Объект.ШаблонПоиска = "ЧЧЧ1\s{0,2}[xх\*\/]\s{0,2}ЧЧЧ2\s{0,2}[mм][mм].?";
    Объект.Число1 = "10.2";
    Объект.Число2 = "5,1";
    
КонецПроцедуры

&НаСервере
Процедура ВыполнитьПоискНаСервере()
    
    RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.MultiLine = ЛОЖЬ; //Многострочный
    RegExp.Global = Истина;
    RegExp.IgnoreCase = Истина; //Регистр верхний/нижний или не учитывать
    
    Число1_1 = СтрНайти(СокрЛП(Объект.Число1), ".");
    Число1_2 = СтрНайти(СокрЛП(Объект.Число1), ",");
    Число1_Длина = СтрДлина(СокрЛП(Объект.Число1));
    Число2_1 = СтрНайти(СокрЛП(Объект.Число2), ".");
    Число2_2 = СтрНайти(СокрЛП(Объект.Число2), ",");
    Число2_Длина = СтрДлина(СокрЛП(Объект.Число2));
    
    Если Число1_1 <> 0 Тогда
        
        СтрокаЧЧЧ1 = Лев(СокрЛП(Объект.Число1), Число1_1-1)+"[\.,]"+Прав(СокрЛП(Объект.Число1),Число1_Длина - Число1_1);
        
    ИначеЕсли Число1_2 <> 0 Тогда
        
        СтрокаЧЧЧ1 = Лев(СокрЛП(Объект.Число1), Число1_2-1)+"[\.,]"+Прав(СокрЛП(Объект.Число1),Число1_Длина - Число1_2);
        
    Иначе
        
        СтрокаЧЧЧ1 = СокрЛП(Объект.Число1);
        
    КонецЕсли;
    
    Если Число2_1 <> 0 Тогда
        
        СтрокаЧЧЧ2 = Лев(СокрЛП(Объект.Число2), Число2_1-1)+"[\.,]"+Прав(СокрЛП(Объект.Число2),Число2_Длина - Число2_1);
        
    ИначеЕсли Число2_2 <> 0 Тогда
        
        СтрокаЧЧЧ2 = Лев(СокрЛП(Объект.Число2), Число2_2-1)+"[\.,]"+Прав(СокрЛП(Объект.Число2),Число2_Длина - Число2_2);
        
    Иначе
        
        СтрокаЧЧЧ2 = СокрЛП(Объект.Число2);
        
    КонецЕсли;
    
    СтрокаШаблона = СтрЗаменить(СтрЗаменить(Объект.ШаблонПоиска, "ЧЧЧ1", СтрокаЧЧЧ1), "ЧЧЧ2", СтрокаЧЧЧ2);
    
    RegExp.Pattern = СокрЛП(СтрокаШаблона);
    
    Matches=RegExp.Execute(СокрЛП(Объект.СтрокаПоиска));
    
    Если Matches.Count > 0 Тогда
        
        SubMatch = Matches.Item(0);
        //Получаем значение первой захваченной группы
        ЭтоНашли = SubMatch.Value;
        Объект.РезультатПоиска = ЭтоНашли;
        
    Иначе
        
        Объект.РезультатПоиска = "";
        
    КонецЕсли;
    
КонецПроцедуры

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua