已经N
定义了单词,对于这个问题 3 个单词,例如:open
icebreaker
umbrela
。
想知道这里是否存在任何可能的首字母缩略词作为英文单词存在,例如想要运行类似:
grep -Pi '^o(p(e?))?i(c(e?))?um?$' my_long_wordlist.txt
在上面的正则表达式中我决定然后我可以使用
- 从第一个词
o
,或op
或ope
(第一个,或前两个,或前三个字母) - 从第二个单词
i
,或ic
或ice
(第一个,或前两个,或前三个字母) - 最后形成最后一个词,我只能使用第一个或前两个字母 -
u
或um
为了好玩 - 上面的正则表达式将为我返回这个词:opium
:)
手动构建正则表达式对于两个测试是可以接受的,但我想检查许多单词组合,所以,寻找一种如何生成正则表达式的方法,如上所述。
想要通过以下调用构建“首字母缩略词查找器正则表达式脚本”:
acrobuild open:4 icebreaker:3 umbrela:3
如您所见,args 是单词,分隔符后面的数字是首字母缩写词中可以使用的最大字母数。
现在的问题 - 我完全失去了如何为给定长度构建正则表达式。需要一些提示、想法或类似的东西.. - 检查“这里需要帮助”:)
目前我有这个:
#!/usr/bin/perl
use 5.012;
use strict;
use warnings;
do_grep( make_regex(@ARGV) );
exit;
sub make_regex {
my(@words) = @_;
my $regex;
foreach my $wordnum (@words) {
$regex .= make_word_regex( split(/:/, $wordnum) );
}
$regex = '^' . $regex . '$' if $regex;
return $regex;
}
sub make_word_regex {
my($word, $num) = @_;
return "" unless $word;
$num = length($word) unless defined($num); #for make legal -> word:0
my(@chars) = split(//, substr($word,0,$num) );
#regex building x or xy? or x(y(z?))? etc... :(
my $re = "";
foreach my $c (reverse(@chars)) { #reverse, to building inside-out
# HOW TO BUILD THE REGEX HERE?
# NEED HELP HERE
}
return($re);
}
sub do_grep {
my($re) = @_;
say "$re"; return; #tmp
my $recomp = qr/$re/i;
open(my $fdict, "<", "/usr/share/dict/web2") or die("No dict file $!");
while(<$fdict>) {
chomp;
say $_ if m/$recomp/;
}
close($fdict);
}