Php 编写无限字母组合的脚本(Regex/ASCII)

Php 编写无限字母组合的脚本(Regex/ASCII),php,python,regex,bash,perl,Php,Python,Regex,Bash,Perl,我正试图根据以下要求创建一个包含所有ASCII字母(至少是拉丁字母)的所有可能组合的.txt文件: A.1-5个字母 B.a-z(以及这些字母的所有可能情况) C.第一和第二、第二和第三、第三和第四、第四和第五之间的空间,用于所有可能的组合 对于exmaple: a, b, c, aa, bb, cc, a bc, aa b, aaa cz, ga l qa, p j asd, n ljas, asdl q, a q j o z; etc. etc. ----- 我用PHP和Regex做了一

我正试图根据以下要求创建一个包含所有ASCII字母(至少是拉丁字母)的所有可能组合的.txt文件:

A.1-5个字母
B.a-z(以及这些字母的所有可能情况)
C.第一和第二、第二和第三、第三和第四、第四和第五之间的空间,用于所有可能的组合

对于exmaple:

a,
b,
c,
aa,
bb,
cc,
a bc,
aa b,
aaa cz,
ga l qa,
p j asd,
n ljas,
asdl q,
a q j o z;

etc. etc.
-----
我用PHP和Regex做了一些尝试,但这不符合我的能力,因为在编写这个脚本时,我不能错过任何一场比赛


任何帮助都将不胜感激

这里是一个通用实现,可以轻松修改以处理不同的字符集
字母
和最大长度
n

注意,我注释掉了
maxLength
letters
的原始值,并选择了
maxLength=3
letters=“ABC”
,以进行测试。实际上,我不认为计算所有必需的组合是容易处理的。我没有试过

导入itertools
#最大长度=5
#letters=“abcdefghijklmnopqrstuvwxyzabefghijklmnopqrstuvxyz”
最大长度=3
字母=“ABC”
对于范围内的长度(1,maxLength+1):
字符串=[“”]*(2*长度-1)
对于itertools.product中的组合(字母,重复=长度):
字符串[::2]=组合
对于itertools.product([“”,“”],repeat=length-1)中的空格:
字符串[1::2]=空格
打印“”连接(字符串)
输出:

A
B
C
AA
A A
AB
A B
.
.
.
CCB
CC B
C CB
C C B
CCC
CC C
C CC
C C C

这是有可能做到这一点使用

使问题变得更简单的一个技巧是认识到
“a”
“a”
可以被视为两个不同的字母,因此我们实际上只处理一组52个可能的字母(大写和小写),然后是104个可能的字母(大写和小写,前缀是否带有空格)

下面的脚本演示了一个小得多的置换子分包:

use strict;
use warnings;

use Algorithm::Combinatorics qw(variations_with_repetition);

#my $maxlength = 5;
#my @letters   = ( 'a' .. 'z', 'A' .. 'Z' );
my $maxlength = 3;
my @letters   = ( 'a' .. 'c' );

for my $prefix (@letters) {
    print "$prefix\n";
    for my $length ( 1 .. $maxlength - 1 ) {
        my $iter = variations_with_repetition( [ map { ( $_, " $_" ) } @letters ], $length );
        while ( my $p = $iter->next ) {
            print $prefix, @$p, "\n";
        }
    }
}
产出:

a
aa
a a
ab
a b
ac
a c
aaa
aa a
aab
aa b
aac
aa c
a aa
a a a
a ab
a a b
a ac
a a c
aba
ab a
abb
ab b
abc
ab c
a ba
a b a
a bb
a b b
a bc
a b c
aca
ac a
acb
ac b
acc
ac c
a ca
a c a
a cb
a c b
a cc
a c c
b
ba
b a
bb
b b
bc
b c
baa
ba a
bab
ba b
bac
ba c
b aa
b a a
b ab
b a b
b ac
b a c
bba
bb a
bbb
bb b
bbc
bb c
b ba
b b a
b bb
b b b
b bc
b b c
bca
bc a
bcb
bc b
bcc
bc c
b ca
b c a
b cb
b c b
b cc
b c c
c
ca
c a
cb
c b
cc
c c
caa
ca a
cab
ca b
cac
ca c
c aa
c a a
c ab
c a b
c ac
c a c
cba
cb a
cbb
cb b
cbc
cb c
c ba
c b a
c bb
c b b
c bc
c b c
cca
cc a
ccb
cc b
ccc
cc c
c ca
c c a
c cb
c c b
c cc
c c c
补遗 为了好玩,我创建了一个脚本,通过排列工作,并在后记中添加空格:

use strict;
use warnings;

use Algorithm::Combinatorics qw(variations_with_repetition);
use List::MoreUtils qw(mesh);

#my $maxlength = 5;
#my @letters   = ( 'a' .. 'z', 'A' .. 'Z' );
my $maxlength = 3;
my @letters   = ( 'a' .. 'c' );

for my $length ( 1 .. $maxlength ) {
    my $iter = variations_with_repetition( \@letters, $length );
    while ( my $p = $iter->next ) {
        print @$p, "\n";
        for my $spaces ( 1 .. 2**( $length - 1 ) - 1 ) {
            my @spaces = (map({$_ ? ' ' : ''} split //, sprintf "%0*b", $length - 1, $spaces), '');
            print mesh(@$p, @spaces), "\n";
        }
    }
}

这将是数千GB。如果您试图构造字典攻击,只需动态生成perm。这不仅仅是编码。您首先必须计划算法将遵循哪些步骤,然后键入它。第一:只有一个字母,然后两个,直到全部,然后,在第一个位置开始空格,然后第二个,然后第三个,然后合并。。。等等。介意我问一下这是干什么用的吗?我想有60多亿个组合:
sum(52**n*2**(n-1)表示范围(1,6)内的n)
它表示广告的关键字匹配,不攻击任何东西,只攻击将运行此长算法过程将其写入文本文件的服务器。条件如下:1。a-ZZZZ(22^5+22^4+22^3+22^2+22^1)2的所有比赛。1输出的字母之间的所有可能空格。(+Its'输出)关于“所有ASCII字母(至少是拉丁字母)”,ASCII仅包含拉丁字母(非重音的a-z和a-z)。谢谢,此脚本有2个问题:1。它停在C2。它错过了BB(或CC、CC等)的匹配。我更新了脚本(修复了一个bug并简化了另一部分)。问题1:如上所述,我将组合限制为从
A
C
的极小子集,因为完整的运行将花费永远的时间。问题2:这是一个bug,但现在应该可以工作了。谢谢,这几乎是所有的事情,只是缺少了当前一个之前的所有字母的匹配(例如,a b a,a b-在这个脚本ATM中不会出现)很抱歉,一切都在那里,只是linux shell无法再处理它了。谢谢Falko的Python脚本涵盖了所有选项++,但我看到你们都玩得很开心,所以我很快就会有更多内容:)