Идея дня
A1sS.RegexReplace(Текст, Шаблон, Замена)— единый способ заменить по регулярному выражению.- Комбинируем с
A1sS.AsString(День 18) иA1sO.Empty/NotEmpty(День 10) для устойчивости. - Строим «конвейеры»: несколько замен подряд для полной нормализации.
Базовые примеры
Функция NormalizeSpaces(Текст) Экспорт
S = A1sS.AsString(Текст);
// 1) Сжать любые пробелы/табуляции/переводы строк до одного пробела
S = A1sS.RegexReplace(S, "\s+", " ");
// 2) Убрать пробелы по краям
S = A1sS.RegexReplace(S, "^\s+|\s+$", "");
Возврат S;
КонецФункции
Сообщить( NormalizeSpaces(" Привет, мир \n\t!") ); // "Привет, мир !"
Схлопывание повторяющихся символов
// Много дефисов → один дефис
A1sS.RegexReplace("A---B----C", "-{2,}", "-"); // "A-B-C"
// Удалить все неразрывные пробелы и заменить на обычный пробел
A1sS.RegexReplace("Цена\u00A0123", "\u00A0", " "); // "Цена 123"
Очистка HTML/маркерной разметки
Функция StripHTML(Текст) Экспорт
S = A1sS.AsString(Текст);
// Убрать теги
S = A1sS.RegexReplace(S, "<[^>]+>", "");
// Схлопнуть пробелы
S = A1sS.RegexReplace(S, "\s+", " ");
// Трим
S = A1sS.RegexReplace(S, "^\s+|\s+$", "");
Возврат S;
КонецФункции
Сообщить( StripHTML("<p>Кабель <b>ПВС</b></p>") ); // "Кабель ПВС"
Если встречаются HTML-сущности ( и др.), их тоже можно заменить через
RegexReplace или обычное СтрЗаменить.
Нормализация телефона
Оставляем только цифры и ведущий «+», убираем прочее.
Функция NormalizePhone(Тел) Экспорт
S = A1sS.AsString(Тел);
// Разрешаем первый "+" и цифры, остальное выбрасываем
S = A1sS.RegexReplace(S, "(?<!^)\+", ""); // все "+" кроме первого
S = A1sS.RegexReplace(S, "[^\d\+]", ""); // всё, что не цифры/+
// Схлопнуть ведущие "8" → "+7" (пример для РФ)
S = A1sS.RegexReplace(S, "^8(\d{10})$", "+7$1");
Возврат S;
КонецФункции
Сообщить( NormalizePhone("+7 (999) 123-45-67") ); // "+79991234567"
Сообщить( NormalizePhone("8 999 123 45 67") ); // "+79991234567"
Подготовка маски для запросов (ПОДОБНО)
Пользователь вводит * и ? — переводим в % и _ для
ПОДОБНО.
Функция ToLikeMask(ПользВвод) Экспорт
S = NormalizeSpaces(ПользВвод);
// Экранируем спецсимволы SQL LIKE: %, _, \
S = A1sS.RegexReplace(S, "([%_\\\])", "\\\\$1");
// Переводим пользовательские шаблоны
S = A1sS.RegexReplace(S, "\*", "%");
S = A1sS.RegexReplace(S, "\?", "_");
// По умолчанию — искать вхождение
Если Лев(С,1) <> "%" Тогда S = "%" + S; КонецЕсли;
Если Прав(С,1) <> "%" Тогда S = S + "%"; КонецЕсли;
Возврат S;
КонецФункции
Функция НайтиИменаПоМаске(Ввод, Лимит = 20) Экспорт
Маска = ToLikeMask(Ввод);
ТекстQ = "
|ВЫБРАТЬ ПЕРВЫЕ &Лимит
| Ном.Наименование КАК Name
|ИЗ Справочник.Номенклатура КАК Ном
|ГДЕ Ном.Наименование ПОДОБНО &Маска
|УПОРЯДОЧИТЬ ПО Name
";
// Порядок: &Лимит, &Маска
Таб = A1sQ.Unload(ТекстQ, Лимит, Маска);
Возврат Таб.ВыгрузитьКолонку("Name");
КонецФункции
Нормализация артикулов/кодиров
Удаляем «мусор», приводим к единому виду.
Функция NormalizeSKU(Код) Экспорт
S = A1sS.AsString(Код);
// Оставить латиницу/цифры/дефис/нижнее подчеркивание
S = A1sS.RegexReplace(S, "[^A-Za-z0-9\-_]", "");
// Несколько дефисов → один
S = A1sS.RegexReplace(S, "-{2,}", "-");
// В верхний регистр
Возврат ВРег(S);
КонецФункции
Конвейер «очистить описание для печати»
Функция CleanDescription(Текст) Экспорт
S = A1sS.AsString(Текст);
// 1) Убрать теги/скрипты
S = A1sS.RegexReplace(S, "<script[^>]*>.*?</script>", "");
S = A1sS.RegexReplace(S, "<style[^>]*>.*?</style>", "");
S = A1sS.RegexReplace(S, "<[^>]+>", "");
// 2) Схлопнуть пробелы и убрать пробелы в начале/конце
S = A1sS.RegexReplace(S, "\s+", " ");
S = A1sS.RegexReplace(S, "^\s+|\s+$", "");
// 3) Длинные тире/многоточия → нормализованные символы
S = A1sS.RegexReplace(S, "[–—]+", "—");
S = A1sS.RegexReplace(S, "\.{3,}", "…");
Возврат S;
КонецФункции
Группы захвата: форматирование ФИО
// "Иванов И И" → "Иванов И.И."
Функция NormalizeFIO(Текст) Экспорт
S = NormalizeSpaces(Текст);
Возврат A1sS.RegexReplace(
S,
"^([А-ЯЁ][а-яё]+)\s+([А-ЯЁ])[.\s]*([А-ЯЁ])\.?$",
"$1 $2.$3."
);
КонецФункции
Анти-паттерны
- Сложные «всё-в-одном» регулярки — лучше несколько простых шагов-конвейера.
- Удалять все не-ASCII «на всякий случай» — ломает кириллицу/имена.
- Чистить пользовательский ввод без логирования исходника — сначала залогируйте и только потом нормализуйте.
Практика (15–30 минут)
- Соберите утилиту
NormalizeSpacesи примените её к формам ввода. - Реализуйте
NormalizePhoneи прикрутите к карточке контрагента. - Сделайте
ToLikeMaskи используйте в поиске ПОДОБНО (см. пример). - Очистите HTML-описание товара для печати через
CleanDescription.
Чек-лист
- □ Пользуюсь
RegexReplaceдля схлопывания пробелов/символов. - □ Очищаю HTML/служебные теги и нормализую телефоны.
- □ Готовлю маску поиска (
*,?→%,_) перед ПОДОБНО. - □ Строю чистые конвейеры из нескольких простых замен.
Что дальше
День 21: A1sLog — Эффективное логирование — уровни, кореляция, формат, полезные шаблоны.