Как составить регулярное выражение для поиска чисел с разделителями разрядов в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки на платформе 1С часто возникает задача парсинга строк, содержащих числовые значения в различных форматах. Например, когда необходимо извлечь сумму из текстового описания, где тысячи разделены пробелами, а дробная часть отделена запятой. Давайте разберем, как построить надежное регулярное выражение для решения этой задачи.

Анализ задачи

Основная сложность заключается в том, что формат записи числа может варьироваться: от простого 123,45 до сложных конструкций вида 1 234 567,89. Если мы будем использовать слишком простые шаблоны, мы рискуем захватить невалидные данные, такие как 1 12 12 1. Поэтому важно правильно сгруппировать квантификаторы повторений.

Разбор оптимального шаблона

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

Шаблон: \d{1,3}(\s\d{3})*(,\d{1,2})?

Давайте проанализируем, как работает каждое звено этого выражения:

  1. \d{1,3} — обозначает поиск первой группы цифр, состоящей из 1, 2 или 3 символов. Это начало нашего числа.
  2. (\s\d{3})* — это группа, которая ищет пробел, за которым следуют ровно 3 цифры. Квантификатор * позволяет этой группе повторяться ноль или более раз, что идеально подходит для длинных чисел (миллионы, миллиарды).
  3. (,\d{1,2})? — необязательная группа, отвечающая за дробную часть. Она ищет запятую и одну или две цифры после нее. Символ ? делает всю группу опциональной.

Реализация в коде 1С

При использовании регулярных выражений в среде 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-файлов.

← На главную