regex - 如何使用 Perl 从一组字母中生成单词列表?

标签 regex string perl parsing string-matching

我正在寻找一个模块、正则表达式或任何其他可能适用于这个问题的东西。

如何以编程方式解析字符串并创建已知的英语 &|鉴于我有一个字典表,我可以根据它检查算法随机化的每个排列是否匹配?

给定一组字符:EBLAIDL KDIOIDSI ADHFWB
程序应返回:BLADE AID KID KIDS FIDDLE HOLA ETC....

我还希望能够定义最小和最大字长以及音节数

输入长度无所谓,只能是字母,标点也无所谓。

谢谢你的帮助

输入字符串中的 EDITLetters 可以重复使用。

例如,如果输入是:ABLED那么输出可能包含:BALLBLEED

最佳答案

您没有指定,所以我假设输入中的每个字母只能使用一次。

[你已经在输入中指定的字母可以多次使用,但我将把这篇文章留在这里,以防有人发现它有用。]

有效地做到这一点的关键是对单词中的字母进行排序。

abracadabra => AAAAABBCDRR
abroad      => AABDOR
drab        => ABDR

然后很明显,“单调”在“abracadabra”中。
abracadabra => AAAAABBCDRR
drab        => A    B  DR

而那个“国外”不是。
abracadabra => AAAAABBCD RR
abroad      => AA   B  DOR

我们将排序后的字母称为“签名”。如果您可以从“A”的签名中删除字母以获得“B”的签名,则单词“B”在单词“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

关于regex - 如何使用 Perl 从一组字母中生成单词列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9105363/

相关文章:

java - 使用 "\\\\"将 '\' 与 Java 中的正则表达式匹配是最易读的方式吗?

regex - 如何为一个原始模式搜索执行多个就地 SEDS?

java - 如何只获取字符串的最后一个字母而不是整个字符串

c++ - 调用 map::count 后销毁的函数参数

regex - grep-如何仅使用两个字符来匹配一个正则表达式,但是每个字符出现相同的次数?

javascript - 正则表达式:无法进行负向预测

regex - Delphi - 用户指定的字符串操作

c - 如何读取字符串中的多行直到C中的指定字符

perl - Perl 5 中有哪些工具可以使外部程序自动化?

perl - 使用带有 HTML::Laundry 的 utf8 pragma 的宽字符错误