Этот вопрос был изначально помечен как perl
, и вот как я на него ответил.Что касается оракула, я понятия не имею, как бы вы поступили так же.Тем не менее, я бы попробовал проверить этот материал до того, как он зашёл так далеко.
Я бы не стал делать это в одном регулярном выражении.Когда вы решите изменить правила, у вас будет столько же работы для создания нового регулярного выражения.Я не стал бы использовать обходные пути для этого, даже если бы они были доступны, поскольку я не хотел бы мириться с возвратом.
Похоже, что это много кода, но часть, которая решает вашу проблему - этоподпрограмма.У этого есть очень простые образцы.Когда правила пароля меняются, вы добавляете или удаляете шаблоны.Возможно, стоит использовать исследование , но я не исследовал это:
use v5.10;
use strict;
use Test::More;
my @valids = qw(
1foo,bar
foo,bar1
1fooobar
foooobar1
fooo11bar
);
my @invalids = qw(
fooo,bar
short
nodigitbutlong
12345678
,,,,,,,,
);
sub is_good_password {
my( $password ) = @_;
state $rules = [
qr/\A[A-Z0-9,._;:-]{8,}\z/i,
qr/[0-9]/,
qr/[A-Z]/i,
];
foreach my $rule ( @$rules ) {
return 0 unless $password =~ $rule;
}
return 1;
}
foreach my $valid ( @valids ) {
ok( is_good_password( $valid ), "Password $valid is valid" );
}
foreach my $invalid ( @invalids ) {
ok( ! is_good_password( $invalid ), "Password $invalid is invalid" );
}
done_testing();