Regex 如何迭代给定模式中可能的每个字符串?
这是一个正则表达式,用于验证url的主机名,取自 我们如何迭代、创建和循环所有可能的组合? 每次迭代正确匹配后,将对结果进行测试。这将发现10116种可能性。考虑到这颗行星是在1017秒前(几乎是昨天)才出现的,这应该会让你坚持一段时间Regex 如何迭代给定模式中可能的每个字符串?,regex,perl,Regex,Perl,这是一个正则表达式,用于验证url的主机名,取自 我们如何迭代、创建和循环所有可能的组合? 每次迭代正确匹配后,将对结果进行测试。这将发现10116种可能性。考虑到这颗行星是在1017秒前(几乎是昨天)才出现的,这应该会让你坚持一段时间 这不是一个通用的方法,只是在这种情况下效果很好的方法。请展示您迄今为止的工作,并解释您在这个问题上遇到的困难。您可能还想考虑它的规模-可能有效URL的数量非常大,并且通过它们循环的任何尝试都不会到达所有可能性集合中,或者触摸真实主机名的有意义的部分。这个话题讲得
这不是一个通用的方法,只是在这种情况下效果很好的方法。请展示您迄今为止的工作,并解释您在这个问题上遇到的困难。您可能还想考虑它的规模-可能有效URL的数量非常大,并且通过它们循环的任何尝试都不会到达所有可能性集合中,或者触摸真实主机名的有意义的部分。这个话题讲得很好。请记住,您看到了大量的可能性——第二个字符类本身将匹配6.3x10^19个字符串。@Slade第二个字符类实际上将匹配
2.2e+109
可能的字符串。再加上最后一个字符类是无界的,这绝对是一个奇怪的目标。朋友之间的几十个数量级是多少?Re“这是验证url主机名的正则表达式”,不,不是。例如,它与www.stackoverflow.com
不匹配。而且,在可观测的星系中只有10^80个原子。我颠倒了集合的顺序,然后颠倒了输出以产生更自然的顺序。如果你不这样做的话,速度会更快,但你似乎有很多时间。
/^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}$/
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;
}