Получение номера без префикса и лидирующих нулей



Получение номера без префикса и лидирующих нулей с помощью регулярных выражений.

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

P.S. Тестирование проводилось на сервере 1С:Предприятие 8.3 (8.3.10.2561)

Обработка демонстрирует работу кода. При нажатии на кнопку в служебном сообщении будет выведен искомый номер. Под номером понимается максимально правое числовое значение строки, не начинающееся с нуля.

Функция размещается в модуле документа или любом общем модуле и вызывается просто.

НомерБезПрефиксаИНулей = ЧисловойНомер(НомерСПрефиксом)
Функция ЧисловойНомер (НомерСПрефиксом, Шаблон="[1-9]d*", ИскатьДоПервогоСовпадения = Истина, МногоСтрок = Истина, ИгнорироватьРегистр = Истина) Экспорт

RegExp = Новый COMОбъект("VBScript.RegExp");    // создаем объект для работы с регулярными выражениями

//Заполняем данные
RegExp.MultiLine = МногоСтрок;                  // истина — текст многострочный, ложь — одна строка
RegExp.Global = Не ИскатьДоПервогоСовпадения;   // истина — поиск по всей строке, ложь — до первого совпадения
RegExp.IgnoreCase = ИгнорироватьРегистр;        // истина — игнорировать регистр строки при поиске
RegExp.Pattern = Шаблон;                        // шаблон (регулярное выражение)

РезультатАнализаСтроки = RegExp.Execute(НомерСПрефиксом);


Для Каждого Выражение Из РезультатАнализаСтроки Цикл
Возврат Выражение.Value;
КонецЦикла;


КонецФункции

 

5 Comments

  1. Naposaram

    А, что там за такая «таблица префиксов». Чего я не знаю?

    Reply
  2. V.Stavinsky

    а просто проверить вхождения каждого символа в «123456789»? и когда первый символ найдется далее искать в «0123456789». так не вариант?

    Reply
  3. CheBurator

    с хвоста строки посимвольно проверяем вхождение в «0123456789».

    нашли первый нецифровой символ — начиная со следующего за ним отрезали строку и применили Число() — так не пойдет? или я что-то не понял? смысл усложнять такую простую задачу регэкспами?

    Reply
  4. kraspila

    (1) Регистр сведений «ПрефиксыИнформационныхБаз»

    Reply
  5. DrAku1a
    Пока Номер<>»» и Найти(«123456789″, Лев(Номер, 1))=0 Цикл
    Номер =Сред(Номер, 2);
    КонецЦикла;
    Номер = ?(Номер=»», «0», Номер);

    Если нужно быстрее, то заменить на

    Ответ = «0»;
    Для НомерСимвола=1 по СтрДлина(Номер) Цикл
    Если Найти(«123456789», Сред(Номер, НомерСимвола, 1))>0 Тогда
    Ответ = Сред(Номер, НомерСимвола);
    Прервать;
    КонецЕсли;
    КонецЦикла;
    Номер = Ответ;
    

    Показать

    Кода немного, при этом тягать регулярные выражения — нужды нет.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *