Найти в наименовании цвет и размер с помощью регулярных выражений. Розница 2.3

У клиента поставщик присылает накладные, где в наименовании товара содержится размер и цвет, а в Рознице при загрузке нужно выделять размер и цвет в отдельные колонки.

В своей жизни я написал уже очень много разборов строк, поэтому решил на этот раз попробовать воспользоваться регулярными выражениям с помощью COM-объекта RegExp.

Открыл онлайн-тестер регулярных выражений regex101.com, почитал шпаргалку и попробовал разобрать наименование «Ботинки (р.16,черный)» с помощью выражения:

\(.+,.+\)

Система выдала, что соответствие найдено:

Но ведь мне нужно было выделить размер и цвет отдельно. Немного почитав документацию, я нашел, как выделять части выражения submatches (группы), получилось выражение:

\((.+),(.+)\)

Пришлось немного поковыряться в интернете, чтобы найти, как не просто проверять на соответствие шаблону, но выделять submatches, в итоге получился код:

RegExp = Новый COMОбъект(«VBScript.RegExp»);// создаем объект для работы с регулярными выражениями
RegExp.MultiLine = Истина;  // истина — текст многострочный, ложь — одна строка
RegExp.Global = Истина;     // истина — поиск по всей строке, ложь — до первого совпадения
RegExp.IgnoreCase = Истина; // истина — игнорировать регистр строки при поиске

ТекНаименование = …;

//Шаблон = «\((.+),(.+)\)»; //не срабатывает
Шаблон = «\(([^\)]+),(.+)\)»;

RegExp.Pattern = Шаблон;    // шаблон (регулярное выражение)

Соответствия = RegExp.Execute(ТекНаименование);
Всего = Соответствия.Count;
//Сообщить(«» + ТекНаименование + «: » + Всего);

Если Соответствия.Count >= 1 Тогда
   
// + » » + Токены.Item(0).SubMatches.Item(0));
   
Соо = Соответствия.Item(Всего — 1).Submatches; //Последний
   
ТекРазмер = СокрЛП(Соо.Item(0));
   
ТекЦвет = СокрЛП(Соо.Item(1));
КонецЕсли;

Но увы, оно не работало на наименованиях вида «Ботинки (детские) (р.16,черный)», т.е. там где было много скобок. Пришлось поправить шаблон на такой:

\(([^\)]+),(.+)\)

Победив подобные наименования, я внезапно столкнулся с еще одним видом наименований:

«Ботинки (детские,девичьи) (р.16,черный)»

Тут уж я спасовал и воспользовался «костылем» на языке 1С в виде выделения последней открывающей скобки:

ПозСкобки = СтрНайти(ТекНаименование, «(«, НаправлениеПоиска.СКонца);
Если
ПозСкобки = 0 Тогда
    Возврат;
//Там где скобок нет, не обрабатываем
КонецЕсли;
ТекНаименование = Сред(ТекНаименование, ПозСкобки);

Даже не знаю, как правильно выделить последний шаблон. Знаете?

Я попробовал поиграть с кванторами «жадности», но не помогало.

Но так или иначе, я набил руку в регулярных выражениях, правда, нужно немного подучить теорию регулярных выражений.

Время факт: 1 час.