1С 8.3 Регулярные выражения
Данные > Примеры кода 1С > 1С 8.3 Регулярные выражения
Регулярные выражения в 1С 8.3 это инструмент для поиска и обработки текстовых данных с использованием шаблонов. Они позволяют выполнять сложные операции с текстом, такие как поиск подстрок, замена, извлечение информации и т. д.
Регулярные выражения представляют собой последовательность символов, которые определяют шаблон поиска. В 1C регулярные выражения используются в различных функциях и методах, таких как СтрЗаменить(), СтрНайти() и других. Для работы с регулярными выражениями в 1C необходимо использовать синтаксис регулярных выражений, который включает в себя различные символы и метасимволы.
Оглавление:
Функции встроенного языка 1С (методы глобального контекста) c 1С 8.3.23. Все функции регистрозависимые.
Функция СтрНайтиПоРегулярномуВыражению. Находит в указанной строке вхождения подстрок, соответствующих заданному регулярному выражению.
Параметры:
<Строка>;
<РегулярноеВыражение>;
<НаправлениеПоиска>;
<НачальнаяПозиция>;
<НомерВхождения>.
Возвращаемое значение: РезультатПоискаПоРегулярномуВыражению, содержащий в себе информацию о результатах поиска регулярного выражения в строке. Метод СтрНайтиПоРегулярномуВыражению возвращает такой объект. Свойства объекта:
НачальнаяПозиция - позиция первого знака найденной подстроки;
Длина - длина найденной подстроки.
Функция СтрЗаменитьПоРегулярномуВыражению. Находит в указанной строке все вхождения подстрок, соответствующих заданному регулярному выражению, и заменяет их на подстроку замены.
Параметры:
<Строка>;
<РегулярноеВыражение>;
<ПодстрокаЗамены>.
Возвращаемое значение: Строка - результирующая строка.
Функция СтрПодобнаПоРегулярномуВыражению. Проверяет указанную строку на соответствие заданному регулярному выражению.
Параметры:
<Строка>;
<РегулярноеВыражение>.
Возвращаемое значение: Булево.
Cправочник по регулярным выражениям в 1С 8.3:
Управляющие символы (., ?, *, +, {}, [], |, $, ^):
. Заменяет один произвольный символ a.c aac, abc ...
^ Отрицание [^0-9] Все кроме цифр. (Ставится внутри скобок)
^ Начало строки ^a Все строки, которые начинаются с буквы a (Ставится в начале строки)
| Альтернативный оператор a|b|c или [abc] Строка содержит либо "a" либо "b" либо "c".
* НОЛЬ или более символов [a-z]* Подряд может идти сколь угодно букв
+ ОДНО или более повторений [a-z]+ Должна быть минимум одна буква
? Ноль или одно повторение 0?7 7, 07
{n,k} [a-z]{1,3} Подряд может идти от одного до трех букв
{n} [a-z]{n}[0-9]{k} Сначала в строке идут n символов, потом k цифр
{n,} [a-z]{0,} Символ может встречаться n и более раз. Тоже самое [a-z]*
$ Конец строки zz$ Все строки, которые заканчиваются строкой "zz"
() Сохранение результата [a-z]{0,} Символ может встречаться n и более раз. Тоже самое [a-z]*
/s Пробел, табуляция, новая строка
/S Все, что не совпадает с /s
/w Слово
/W Все, что не совпадает с /w
/d Цифры
/D Все, что не совпадает с /d
Найти номер и дату договора с помощью рег.выражения в 1С 8.3:
Найти номер и дату договора.
Используется, если нужно найти в тексте, например, назначения платежа номер договора, по которому идет оплата.
В зависимости от формата договора регулярное выражение может иметь вот такой вид:
\s*([A-Za-zА-Яа-я0-9\-\/]+)[^\d]*(\d{2}[.]\d{2}[.]\d{2,4})
Краткое пояснение:
\s* — игнорирует пробелы.
([A-Za-zА-Яа-я0-9\-\/]+) — находит номер договора, состоящий из букв, цифр и символов.
(\d{2}[.]\d{2}[.]\d{2,4}) — находит дату в формате дд.мм.гггг.
ИсходнаяСтрока = "Оплата счета по договору №45/Фм от 24.05.2024г. на сумму 10 000 руб, без НДС";
СтрокаРегулярногоВыражения = "\s*([A-Za-zА-Яа-я0-9\-\/]+)[^\d]*(\d{2}[.]\d{2}[.]\d{2,4})";
Результат = СтрНайтиПоРегулярномуВыражению(ИсходнаяСтрока, СтрокаРегулярногоВыражения);
Сообщить(Результат.Значение); // Результат - 45/Фм от 24.05.2024
СтрокаРегулярногоВыражения = "\s*([A-Za-zА-Яа-я0-9\-\/]+)[^\d]*(\d{2}[.]\d{2}[.]\d{2,4})";
Результат = СтрНайтиПоРегулярномуВыражению(ИсходнаяСтрока, СтрокаРегулярногоВыражения);
Сообщить(Результат.Значение); // Результат - 45/Фм от 24.05.2024
Найти строку с исключением с помощью рег.выражения в 1С 8.3:
Найти строку с исключением - используется, если нужно что-то найти, но при этом в строке не должно быть исключения. В этом случае можем использовать вот такой шаблон регулярного выражения:
^(?!.*Исключение).*СтрокаПоиска
Например, мы хотим найти договоры от контрагента, но исключить договоры за 2023 год. Для этого будем использовать вот такое регулярное выражение:
^(?!.*2023).*\s*([A-Za-zА-Яа-я0-9\-\/]+)[^\d]*(\d{2}[.](\d{2}[.])?\d{2,4})
СтрокаПоиска = "^(?!.*2023).*\s*([A-Za-zА-Яа-я0-9\-\/]+)[^\d]*(\d{2}[.](\d{2}[.])?\d{2,4})";
СтрокаЗначения = "Оплата счета по договору №45/Фм от 24.05.2023г. на сумму 10 000 руб, без НДС";
Результат = СтрНайтиПоРегулярномуВыражению(СтрокаЗначения, СтрокаПоиска);
Сообщить(Результат.Значение); // Результат - ""
СтрокаЗначения = "Оплата счета по договору №68/Ав от 25.09.2024г. на сумму 20 000 руб, без НДС";
Результат = СтрНайтиПоРегулярномуВыражению(СтрокаЗначения, СтрокаПоиска);
Сообщить(Результат.Значение); // Результат - "Оплата счета по договору №68/Ав от 25.09.2024г. на сумму 20 000 руб, без НДС"
СтрокаЗначения = "Оплата счета по договору №45/Фм от 24.05.2023г. на сумму 10 000 руб, без НДС";
Результат = СтрНайтиПоРегулярномуВыражению(СтрокаЗначения, СтрокаПоиска);
Сообщить(Результат.Значение); // Результат - ""
СтрокаЗначения = "Оплата счета по договору №68/Ав от 25.09.2024г. на сумму 20 000 руб, без НДС";
Результат = СтрНайтиПоРегулярномуВыражению(СтрокаЗначения, СтрокаПоиска);
Сообщить(Результат.Значение); // Результат - "Оплата счета по договору №68/Ав от 25.09.2024г. на сумму 20 000 руб, без НДС"
Найти какая группа сработала с помощью рег.выражения в 1С 8.3:
Найти какая группа сработала - используется, если нужно найти какое из условий поиска сработало. Например, мы в тексте платежа хотим понять, что было оплачено - счет, договор или акт.
Для решения этой задачи создаем вот такой шаблон регулярного выражения:
(счет)|(договор)|(акт)
СтрокаПоиска = "(счет) |(договор)|(акт)";
СтрокаЗначения = "Оплата счета №431";
Результат = СтрНайтиПоРегулярномуВыражению(СтрокаЗначения, СтрокаПоиска, , , , Истина);
Для Каждого Группа Из Результат.ПолучитьГруппы() Цикл
Если Группа.Длина > 0 Тогда
Сообщить(Группа.Значение); // Результат - счет
Прервать;
КонецЕсли;
КонецЦикла;
СтрокаЗначения = "Оплата акта №153/ф";
Результат = СтрНайтиПоРегулярномуВыражению(СтрокаЗначения, СтрокаПоиска, , , , Истина);
Для Каждого Группа Из Результат.ПолучитьГруппы() Цикл
Если Группа.Длина > 0 Тогда
Сообщить(Группа.Значение); // Результат - акт
Прервать;
КонецЕсли;
КонецЦикла;
СтрокаЗначения = "Оплата счета №431";
Результат = СтрНайтиПоРегулярномуВыражению(СтрокаЗначения, СтрокаПоиска, , , , Истина);
Для Каждого Группа Из Результат.ПолучитьГруппы() Цикл
Если Группа.Длина > 0 Тогда
Сообщить(Группа.Значение); // Результат - счет
Прервать;
КонецЕсли;
КонецЦикла;
СтрокаЗначения = "Оплата акта №153/ф";
Результат = СтрНайтиПоРегулярномуВыражению(СтрокаЗначения, СтрокаПоиска, , , , Истина);
Для Каждого Группа Из Результат.ПолучитьГруппы() Цикл
Если Группа.Длина > 0 Тогда
Сообщить(Группа.Значение); // Результат - акт
Прервать;
КонецЕсли;
КонецЦикла;
Парсинг строки с помощью RegExp (через COMОбъект) в 1С 8.3:
//Получить из строки значение productId в формате числа
ПроверяемаяСтрока = "?productId=3453646&vendorId=02";
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.MultiLine = Истина;
RegExp.Global = Истина;
RegExp.IgnoreCase = Истина;
// \d+ - последовательность чисел, не меньше 1 символа
// скобки - захватить значение в отдельную группу
RegExp.Pattern = "productId=(\d+)";
Matches=RegExp.Execute(ПроверяемаяСтрока);
Если Matches.Count > 0 Тогда
SubMatch = Matches.Item(0);
//Получаем значение первой захваченной группы
productId= SubMatch.SubMatches.Item(0);
Сообщить("productId: " + productId);
КонецЕсли;
ПроверяемаяСтрока = "?productId=3453646&vendorId=02";
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.MultiLine = Истина;
RegExp.Global = Истина;
RegExp.IgnoreCase = Истина;
// \d+ - последовательность чисел, не меньше 1 символа
// скобки - захватить значение в отдельную группу
RegExp.Pattern = "productId=(\d+)";
Matches=RegExp.Execute(ПроверяемаяСтрока);
Если Matches.Count > 0 Тогда
SubMatch = Matches.Item(0);
//Получаем значение первой захваченной группы
productId= SubMatch.SubMatches.Item(0);
Сообщить("productId: " + productId);
КонецЕсли;
💡 Шаблоны (готовые модели) кода 1С 8.3 с тегом #Регулярные выражения:
- пока тут пусто
📰 Актуальные новости с тегом #Регулярные выражения:
- В версии 8.3.23 добавлены новые методы глобального контекста: СтрНайтиПоРегулярномуВыражению, СтрЗаменитьПоРегулярномуВыражению, СтрПодобнаПоРегулярномуВыражению. Добавлен новый объект РезультатПоискаПоРегулярномуВыражению.
0
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник