正则表达式 – 如何使用Perl从一组字母中生成单词列表?

前端之家收集整理的这篇文章主要介绍了正则表达式 – 如何使用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 /^\pL\z/,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

猜你在找的正则表达式相关文章