1С 8.3 Поиск похожей строки из набора строк
Данные > Примеры кода 1С > 1С 8.3 Строка, текст, буквы
Перейти в раздел примеры кода 1С 8.3:
Поиск похожей строки из массива объектов для проверки на основании исходной строки. Пруф: https://fastcode.im/Templates/8203/poiskpoxozhejstroki-8-3-bez-rezhima-sovmestimosti-s-8-2
ПоискПохожейСтроки (8.3 без режима совместимости с 8.2) в 1С 8.3:
// Функция - Поиск похожей строки из набора строк
//
// Параметры:
// ИсходнаяСтрока - Строка - Исходная строка
// ОбъектыДляПроверки - Массив - Массив элементов произвольного типа, в котором будем искать похожую строку
// пНаправлениеПоиска - НаправлениеПоиска - Указывает направление поиска подстроки в строке
// ЖелательныйПроцентСовпадения - Число - Ожидаемый процент совпадения подстроки поиска в проверяемой строке. По умолчанию 50
//
// Возвращаемое значение:
// Строка - строка с максимальным вхождением подстроки поиска
//
Функция ПоискПохожейСтроки(ИсходнаяСтрока, ОбъектыДляПроверки, пНаправлениеПоиска, ЖелательныйПроцентСовпадения)
ПохожаяСтрока = "";
ТаблицаСтатистики = Новый ТаблицаЗначений;
ТаблицаСтатистики.Колонки.Добавить("Объект");
ТаблицаСтатистики.Колонки.Добавить("ЧислоВхождений");
ДлинаИсходнойСтроки = СтрДлина(ИсходнаяСтрока);
Для Каждого Элемент Из ОбъектыДляПроверки Цикл
ТекОбъект = ВРЕГ(Элемент);
ДлинаТекОбъекта = СтрДлина(ТекОбъект);
Для Сч = 0 По ДлинаИсходнойСтроки Цикл
Если пНаправлениеПоиска = НаправлениеПоиска.СНачала Тогда
ИскомаяСтрока = Сред(ИсходнаяСтрока, 1, Сч + 1);
НачПозицияПоиска = 1;
Иначе
ИскомаяСтрока = Сред(ИсходнаяСтрока, ДлинаИсходнойСтроки - Сч, Сч + 1);
НачПозицияПоиска = ДлинаТекОбъекта;
КонецЕсли;
Если СтрНайти(ТекОбъект, ИскомаяСтрока, пНаправлениеПоиска, НачПозицияПоиска) > 0 Тогда
СтрСтатистика = ТаблицаСтатистики.Найти(ТекОбъект, "Объект");
Если СтрСтатистика <> Неопределено Тогда
СтрСтатистика.ЧислоВхождений = СтрДлина(ИскомаяСтрока);
Иначе
Если Цел(СтрДлина(ИскомаяСтрока) / ДлинаТекОбъекта * 100) > ЖелательныйПроцентСовпадения Тогда
СтрСтатистика = ТаблицаСтатистики.Добавить();
СтрСтатистика.Объект = ТекОбъект;
СтрСтатистика.ЧислоВхождений = СтрДлина(ИскомаяСтрока);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если ЗначениеЗаполнено(ТаблицаСтатистики) Тогда
ТаблицаСтатистики.Сортировать("ЧислоВхождений УБЫВ");
ПохожаяСтрока = ТаблицаСтатистики.Получить(0).Объект;
КонецЕсли;
Возврат ПохожаяСтрока
КонецФункции
// Параметры:
// ИсходнаяСтрока - Строка - Исходная строка
// ОбъектыДляПроверки - Массив - Массив элементов произвольного типа, в котором будем искать похожую строку
// пНаправлениеПоиска - НаправлениеПоиска - Указывает направление поиска подстроки в строке
// ЖелательныйПроцентСовпадения - Число - Ожидаемый процент совпадения подстроки поиска в проверяемой строке. По умолчанию 50
//
// Возвращаемое значение:
// Строка - строка с максимальным вхождением подстроки поиска
//
Функция ПоискПохожейСтроки(ИсходнаяСтрока, ОбъектыДляПроверки, пНаправлениеПоиска, ЖелательныйПроцентСовпадения)
ПохожаяСтрока = "";
ТаблицаСтатистики = Новый ТаблицаЗначений;
ТаблицаСтатистики.Колонки.Добавить("Объект");
ТаблицаСтатистики.Колонки.Добавить("ЧислоВхождений");
ДлинаИсходнойСтроки = СтрДлина(ИсходнаяСтрока);
Для Каждого Элемент Из ОбъектыДляПроверки Цикл
ТекОбъект = ВРЕГ(Элемент);
ДлинаТекОбъекта = СтрДлина(ТекОбъект);
Для Сч = 0 По ДлинаИсходнойСтроки Цикл
Если пНаправлениеПоиска = НаправлениеПоиска.СНачала Тогда
ИскомаяСтрока = Сред(ИсходнаяСтрока, 1, Сч + 1);
НачПозицияПоиска = 1;
Иначе
ИскомаяСтрока = Сред(ИсходнаяСтрока, ДлинаИсходнойСтроки - Сч, Сч + 1);
НачПозицияПоиска = ДлинаТекОбъекта;
КонецЕсли;
Если СтрНайти(ТекОбъект, ИскомаяСтрока, пНаправлениеПоиска, НачПозицияПоиска) > 0 Тогда
СтрСтатистика = ТаблицаСтатистики.Найти(ТекОбъект, "Объект");
Если СтрСтатистика <> Неопределено Тогда
СтрСтатистика.ЧислоВхождений = СтрДлина(ИскомаяСтрока);
Иначе
Если Цел(СтрДлина(ИскомаяСтрока) / ДлинаТекОбъекта * 100) > ЖелательныйПроцентСовпадения Тогда
СтрСтатистика = ТаблицаСтатистики.Добавить();
СтрСтатистика.Объект = ТекОбъект;
СтрСтатистика.ЧислоВхождений = СтрДлина(ИскомаяСтрока);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если ЗначениеЗаполнено(ТаблицаСтатистики) Тогда
ТаблицаСтатистики.Сортировать("ЧислоВхождений УБЫВ");
ПохожаяСтрока = ТаблицаСтатистики.Получить(0).Объект;
КонецЕсли;
Возврат ПохожаяСтрока
КонецФункции
//
0
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник