Добрый день!
Не могу собрать в мозгах шаблон для 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 @ Сегодня, 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