При разработке интеграций или обработке пользовательского ввода часто возникает задача «очистки» строки. Например, в наименовании товара или коде могут встречаться иероглифы, спецсимволы или знаки препинания, которые мешают дальнейшей обработке данных. Давайте разберем, как эффективно удалить всё лишнее, оставив только кириллицу, латиницу и цифры.
Самый изящный способ, если вы работаете в среде Windows, — использование объекта VBScript.RegExp. Этот метод позволяет описать шаблон допустимых символов и «вытащить» только то, что нам нужно.
Рассмотрим, как это реализовать на практике:
Результат = \"\";
RegExp = Новый COMОбъект(\"VBScript.RegExp\");
RegExp.Global = True;
RegExp.IgnoreCase = True;
RegExp.Pattern = \"[а-яёa-z0-9]+\";
РезультатАнализаСтроки = RegExp.Execute(ИсходнаяСтрока);
Для Каждого ПодходящийЭлемент ИЗ РезультатАнализаСтроки Цикл
Результат = Результат + ПодходящийЭлемент.Value;
КонецЦикла;
Важное примечание: Этот метод очень удобен, но при массовой обработке тысяч строк в циклах он может работать медленнее, чем прямая проверка кодов символов, из-за накладных расходов на создание COM-объекта.
Если вы хотите избежать использования внешних объектов, можно применить посимвольный анализ. Мы создаем строку-алфавит из всех допустимых символов и проверяем каждый знак исходной строки на вхождение в этот алфавит.
ПолученнаяСтрока = \"\";
ДопустимыеСимволы = \"0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz\";
// Добавьте сюда русские буквы, если необходимо
Для Шаг = 1 По СтрДлина(ИсходнаяСтрока) Цикл
ТекущийСимвол = Сред(ИсходнаяСтрока, Шаг, 1);
Если СтрНайти(ДопустимыеСимволы, ТекущийСимвол) > 0 Тогда
ПолученнаяСтрока = ПолученнаяСтрока + ТекущийСимвол;
КонецЕсли;
КонецЦикла;
Этот метод интуитивно понятен. Однако, если строка очень длинная, функция Сред() внутри цикла может стать «узким местом». В таких случаях лучше переходить к следующему способу.
Наиболее производительный метод для больших массивов данных — проверка через коды КодСимвола(). Вместо поиска по строке мы сравниваем числовое значение каждого символа с диапазонами Unicode.
Рекомендуем использовать этот способ, если производительность системы критична.
Можно использовать штатные функции платформы для «фильтрации» строки. Обратите внимание на важный нюанс: при разделении строки обязательно отключайте параметр ВключатьПустые.
ДопустимыеСимволы = \"0123456789AaBbCc...\"; // Полный список
МассивЧастей = СтрРазделить(ИсходнаяСтрока, ДопустимыеСимволы, Ложь);
// Использование Ложь ускоряет работу за счет отсутствия пустых элементов
ИтоговаяСтрока = СтрСоединить(МассивЧастей, \"\");
Прежде чем приступать к удалению, проанализируйте данные. Если символы, которые вы планируете удалить (например, иероглифы), несут смысловую нагрузку для бизнеса, лучше использовать «черные списки» — то есть удалять только те символы, которые точно запрещены, вместо того чтобы стирать все подряд.
Также помните о нормализации: после очистки в строке могут остаться двойные пробелы. Для их устранения используйте комбинацию СтрЗаменить() или циклическую обработку, чтобы привести строку к аккуратному виду.