我是新来的正则表达式。
我需要按照以下模式打印所有组合的8个字符(字母数字)。
正则表达式用于定义语法。匹配和替代运算符检查字符串是否与使用正则表达式定义的语法模式匹配。我不知道使用正则表达式模式生成字符串的任何工具。
当您有任意数量的嵌套循环时,就需要Algorithm :: Loops的NestedLoops
。在您的情况下,循环的数量是固定的,但是NestedLoops
无论如何,有用的循环太多了。
[我假设您只对ASCII中的字母和数字感兴趣。]
天真(生成所有序列,并过滤掉不需要的序列):
use Algorithm::Loops qw( NestedLoops );
my @syms = ('A'..'Z', 'a'..'z', '0'..'9');
my $iter = NestedLoops([ (\@syms) x 8 ]);
while (my @s = $iter->()) {
my $s = join('', @s);
next if $s !~ /^[a-zA-Z][0-9]/;
next if $s =~ /[a-zA-Z]{4}|[0-9]{3}/;
say $s;
}
大多数情况下是天真的(生成所有序列,除了明显不好的序列,然后过滤掉不需要的序列):
use Algorithm::Loops qw( NestedLoops );
my @letters = ('A'..'Z', 'a'..'z');
my @digits = ('0'..'9');
my @syms = (@letters, @digits);
my $iter = NestedLoops([
\@letters,
\@digits,
(\@syms) x 6,
]);
while (my @s = $iter->()) {
my $s = join('', @s);
next if $s =~ /[a-zA-Z]{4}|[0-9]{3}/;
say $s;
}
但这仍然会产生很多需要丢弃的字符串。以下仅生成我们想要的字符串。它通过产生,将产生所希望的字符串的图案(LDLLLDLL
,LDLLLDLD
,LDLLLDDL
,LDLLDLLL
,...),然后建立从这些模式字符串。
高效的算法(这并不意味着实现是有效的):
use Algorithm::Loops qw( NestedLoops );
my @letters = ('A'..'Z', 'a'..'z');
my @digits = ('0'..'9');
sub make_pat_gen_iter {
my $raw_pat_gen_iter = NestedLoops([
['L'],
['D'],
(['L','D']) x 6,
]);
return sub {
while (1) {
my @pat = $raw_pat_gen_iter->();
return () if !@pat;
my $pat = join('', @pat);
next if $pat =~ /L{4}|D{3}/;
return @pat;
}
};
}
sub make_gen_iter {
my $pat_gen_iter = make_pat_gen_iter();
my @pat;
my $gen_sub_iter;
return sub {
return () if !$pat_gen_iter;
while (1) {
if (!$gen_sub_iter) {
@pat = $pat_gen_iter->();
if (!@pat) {
$pat_gen_iter = undef;
return ();
}
$gen_sub_iter = NestedLoops([
map { $_ eq 'L' ? \@letters : \@digits } @pat
]);
}
my @s = $gen_sub_iter->();
if (!@s) {
$gen_sub_iter = undef;
next;
}
return join('', @s);
}
};
}
my $gen_iter = make_gen_iter();
while (defined( my $s = $gen_iter->() )) {
say $s;
}
有趣的是,以下是模式迭代器的完整结果:
LDLLLDLL LDLLLDLD LDLLLDDL LDLLDLLL LDLLDLLD
LDLLDLDL LDLLDLDD LDLLDDLL LDLLDDLD LDLDLLLD
LDLDLLDL LDLDLLDD LDLDLDLL LDLDLDLD LDLDLDDL
LDLDDLLL LDLDDLLD LDLDDLDL LDLDDLDD LDDLLLDL
LDDLLLDD LDDLLDLL LDDLLDLD LDDLLDDL LDDLDLLL
LDDLDLLD LDDLDLDL LDDLDLDD LDDLDDLL LDDLDDLD
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句