Есть части проблемы, которые не определены достаточно точно (пока).
Некоторые из подходов, которые зависят от деталей, сводятся к следующему:
Если определенные пользователем замены являются глобальными (заменять каждое вхождение символа в каждомстрока) пользователь может отправить сопоставление, как, скажем, хэш, и вы можете исправить их все.Процесс идентифицирует всех кандидатов на слова (наряду с фактическими, не исправленными словами, если они найдены).Могут быть ложные срабатывания, поэтому также планируйте некоторую постобработку
Если пользователь может предоставить список подстановок вместе с словами, к которым он применяется (искаженныеили соответствующие неполадки), тогда мы можем выполнить более целенаправленный прогон
Прежде чем это выяснится, есть еще один способ: использовать модуль для приблизительного («нечеткого») сопоставления.
String :: Approx , кажется, соответствует довольно многим из ваших требований.
Совпадение цели с заданной строкой основано на понятии расстояния редактирования Левенштейна : сколько вставок, удалений и замен («правок») требуется для получения заданнойСтрока в искомую цель.Максимальное допустимое количество правок может быть установлено.
Простой пример:
use warnings;
use strict;
use feature 'say';
use String::Approx qw(amatch);
my $target = qq(russianhacker);
my @text = qw(that h@cker was a russ1@anh@ck3r);
my @matches = amatch($target, ["25%"], @text);
say for @matches; #==> russ1@anh@ck3r
См. Документацию о том, что модуль нам помогает, но есть как минимум два комментария.
Во-первых, обратите внимание, что второй аргумент в amatch
указывает допустимое отклонение в процентах от целевой строки.Для этого конкретного примера нам нужно разрешить редактировать каждый четвертый символ.Так много места для настройки может привести к случайным совпадениям, которые затем необходимо отфильтровать, поэтому потребуется некоторая постобработка.
Во-вторых, мы не поймали более легкого, h@cker
.Модуль принимает фиксированный «шаблон» (цель), а не регулярное выражение, и может искать только один шаблон за раз.Итак, в принципе, вам нужен проход для каждой целевой строки.Это может быть улучшено, но будет больше работы.
Пожалуйста, изучите документацию;модуль предлагает намного больше, чем этот простой пример.