В процессе разработки на платформе 1С часто возникает задача парсинга строк, содержащих числовые значения в различных форматах. Например, когда необходимо извлечь сумму из текстового описания, где тысячи разделены пробелами, а дробная часть отделена запятой. Давайте разберем, как построить надежное регулярное выражение для решения этой задачи.
Основная сложность заключается в том, что формат записи числа может варьироваться: от простого 123,45 до сложных конструкций вида 1 234 567,89. Если мы будем использовать слишком простые шаблоны, мы рискуем захватить невалидные данные, такие как 1 12 12 1. Поэтому важно правильно сгруппировать квантификаторы повторений.
Для поиска чисел, которые могут иметь разделители групп разрядов (пробелы) и дробную часть, мы рекомендуем использовать следующую структуру регулярного выражения:
Шаблон: \d{1,3}(\s\d{3})*(,\d{1,2})?
Давайте проанализируем, как работает каждое звено этого выражения:
\d{1,3} — обозначает поиск первой группы цифр, состоящей из 1, 2 или 3 символов. Это начало нашего числа.(\s\d{3})* — это группа, которая ищет пробел, за которым следуют ровно 3 цифры. Квантификатор * позволяет этой группе повторяться ноль или более раз, что идеально подходит для длинных чисел (миллионы, миллиарды).(,\d{1,2})? — необязательная группа, отвечающая за дробную часть. Она ищет запятую и одну или две цифры после нее. Символ ? делает всю группу опциональной.При использовании регулярных выражений в среде 1С через объект VBScript.RegExp, важно правильно задать свойства объекта. Рассмотрим пример использования этого шаблона:
// Создаем объект для работы с регулярными выражениями
РегВыражение = Новый COMОбъект("VBScript.RegExp");
РегВыражение.Global = Истина; // Ищем все вхождения
РегВыражение.IgnoreCase = Истина; // Игнорируем регистр
РегВыражение.Pattern = "\d{1,3}(\s\d{3})*(,\d{1,2})?";
ТекстДляПоиска = "Сумма платежа составила 1 234 567,89 руб.";
Результаты = РегВыражение.Execute(ТекстДляПоиска);
Для Каждого Находка Из Результаты Цикл
Сообщить("Найдено число: " + Находка.Value);
КонецЦикла;
В процессе работы мы можем столкнуться с тем, что стандартный пробел в строке отличается от того, который ожидает регулярное выражение. В 1С часто встречаются неразрывные пробелы (символ с кодом 160). Если стандартный шаблон \s не находит совпадения, выполните предварительную замену:
Совет: Если вы сталкиваетесь с «мусорными» символами, приводите строку к единому формату перед поиском.
// Замена неразрывных пробелов на обычные
ОчищеннаяСтрока = СтрЗаменить(ИсходнаяСтрока, Символ(160), " ");
Также, если требуется строгое соответствие шаблону, исключающее поиск чисел внутри других слов, используйте ограничители границ слова \b в начале и конце регулярного выражения. Это гарантирует, что движок не «приклеит» лишние цифры к вашему результату.
Используя предложенные методы, вы сможете точно и эффективно находить числовые значения в любых текстовых полях, будь то комментарии в документах 1С:Документооборот или данные, загружаемые из внешних Excel-файлов.