Один из способов исключить строки, содержащие слова из заданного списка, состоит в том, чтобы сформировать шаблон с чередованием слов и использовать его в регулярном выражении, в результате чего совпадение исключает строку.
use warnings;
use strict;
use feature qw(say);
use Path::Tiny;
my $file = shift // die "Usage: $0 file\n"; #/
my @words = split ' ', path($file)->slurp;
my $exclude = join '|', map { quotemeta } @words;
foreach my $string (qw(a1testtre orangesh1 apleship3))
{
if ($string !~ /$exclude/) {
say "OK: $string";
}
}
Я использую Path :: Tiny , чтобы прочитать файл в строку ("slurp"), которая затем разделяется на пробелы в слова, которые используются для исключения. quotemeta экранирует не-словесные символы, если таковые встречаются в ваших словах, которые затем соединяются |
, чтобы сформировать строку с шаблоном регулярных выражений. (Для сложных паттернов используйте qr .)
Это может быть возможно настроить и улучшить, в зависимости от ваших вариантов использования, для одного в отношении порядка образцов с общими частями поочередно. & dagger;
Проверка того, что последовательные повторяющиеся символы встречаются не более трех раз
foreach my $string (qw(adminnisstrator21 kkeeykloakk stack22ooverflow))
{
my @chars_that_repeat = $string =~ /(.)\1+/g;
if (@chars_that_repeat < 3) {
say "OK: $string";
}
}
Длинная строка повторяющихся символов (aaaa
) считается одним экземпляром из-за квантификатора +
в регулярном выражении; если вы предпочитаете считать все пары, удалите +
, и четыре a
s будут считаться двумя парами. Один и тот же символ, повторяющийся в разных местах строки, считается каждый раз, поэтому aaXaa
считается двумя парами.
Этот фрагмент может быть просто добавлен в вышеупомянутую программу, которая вызывается с именем файла со словами, которые будут использоваться для исключения. Они оба печатают то, что ожидается от предоставленных образцов.
& кинжалом; & thinsp; Рассмотрим пример со словами исключения: so
, sole
и solely
. Если вам нужно только проверить, совпадает ли какое-либо из этих совпадений, то сначала вам понадобятся более короткие в чередовании
my $exclude = join '|', map { quotemeta } sort { length $a <=> length $b } @words;
#==> so|sole|solely
для более быстрого совпадения (so
соответствует всем трем). Это, безусловно, имеет место здесь.
Но, если вы хотите правильно определить, какое слово соответствует, то у вас должно быть сначала длинные слова,
solely|sole|so
, чтобы строка solely
правильно соответствовала своему слову, прежде чем она может быть "украдена" so
. Тогда в этом случае вы захотите наоборот
sort { length $b <=> length $a }