正则表达式 – 如何使用Perl从一组字母中生成单词列表?
我正在寻找可能适用于此问题的模块,正则表达式或其他任何内容.
我如何以编程方式解析字符串并创建已知的英语& |西班牙语单词,我有一个字典表,我可以检查算法的随机化匹配的每个排列? 鉴于一组字符:EBLAIDL KDIOIDSI ADHFWB 该计划应该返回:BLADE AID KID KIDS FIDDLE HOLA等…. 我还希望能够定义最小值和最小值.最大字长以及音节数 输入长度无关紧要,它必须只是字母,标点符号无关紧要. 谢谢你的帮助 输入字符串中的EDITLetters可以重复使用. 例如,如果输入为:ABLED,则输出可能包含:BALL或BLEED 解决方法
你没有指定,所以我假设输入中的每个字母只能使用一次.
[你已经指定输入中的字母可以多次使用,但我会在这里留下这篇文章以防有人发现它有用.] 有效地做到这一点的关键是对单词中的字母进行排序. abracadabra => AAAAABBCDRR abroad => AABDOR drab => ABDR 然后很明显“drab”在“abracadabra”中. abracadabra => AAAAABBCDRR drab => A B DR 那“国外”不是. abracadabra => AAAAABBCD RR abroad => AA B DOR 我们将排序后的字母称为“签名”.如果您可以从“A”的签名中删除字母以获得“B”的签名,则单词“B”in在单词“A”中.使用正则表达式模式很容易检查. sig('drab') =~ /^A?A?A?A?A?B?B?C?D?R?R?z/ 或者,如果我们为了效率而消除不必要的回溯,我们就会得到 sig('drab') =~ /^A?+A?+A?+A?+A?+B?+B?+C?+D?+R?+R?+z/ 既然我们知道我们想要什么样的模式,那只需要构建它. use strict; use warnings; use feature qw( say ); sub sig { join '',sort grep /^pLz/,split //,uc $_[0] } my $key = shift(@ARGV); my $pat = sig($key); $pat =~ s/.K/?+/sg; my $re = qr/^(?:$pat)z/s; my $shortest = 9**9**9; my $longest = 0; my $count = 0; while (my $word = <>) { chomp($word); next if !length($word); # My dictionary starts with a blank line!! next if sig($word) !~ /$re/; say $word; ++$count; $shortest = length($word) if length($word) < $shortest; $longest = length($word) if length($word) > $longest; } say "Words: $count"; if ($count) { say "Shortest: $shortest"; say "Longest: $longest"; } 例: $perl script.pl EBLAIDL /usr/share/dict/words A Abe Abel Al ... libel lid lie lied Words: 117 Shortest: 1 Longest: 6 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |