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;
Объект.РезультатПоиска = ЭтоНашли;
Иначе
Объект.РезультатПоиска = "";
КонецЕсли;
КонецПроцедуры