如何迭代给定模式中的每个字符串?

时间:2014-08-12 22:28:04

标签: regex perl

/^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}$/

这是一个正则表达式,用于验证网址的主机名,取自Domain name validation with RegEx

我们如何迭代或创建和循环每个可能的组合? 在每次正确匹配迭代之后,将对结果进行测试。

1 个答案:

答案 0 :(得分:1)

这将找到10个 116 的可能性。考虑到这个星球只存在于10 17 秒前(几乎是昨天!),这应该会让你停留一段时间。

use strict;
use warnings;
use feature qw( say );

use Algorithm::Loops qw( NestedLoops );

my @char_set1 = ('a'..'z', 'A'..'Z', '0'..'9' );
my @char_set2 = ('a'..'z', 'A'..'Z', '0'..'9', '-');
my @char_set3 = (undef, 'a'..'z', 'A'..'Z', '0'..'9', '-');
my @char_set4 = ('a'..'z', 'A'..'Z');
my @char_set5 = (undef, 'a'..'z', 'A'..'Z');

my $iter = NestedLoops([
   (\@char_set4) x 2,
    ['.'],
   (\@char_set3) x 60,
    \@char_set2,
    \@char_set1,
]);

while (my @chars = $iter->()) {
   say join '', reverse grep defined, @chars;
}

这不是一般方法,只是在这种情况下运作良好的方法。