有N
定義的話,這個問題3個字例如:open
icebreaker
umbrela
。首字母縮寫詞搜索正則表達式建設與perl
想知道這裏的任何可能的縮寫詞是什麼作爲英語單詞存在,例如,想運行是這樣的:在上述正則表達式,然後我決定
grep -Pi '^o(p(e?))?i(c(e?))?um?$' my_long_wordlist.txt
我可以使用
- 從第一個字
o
,或op
或ope
(第一或前兩個或前三個字母) - 從第2個字
i
,或ic
或ice
(第一或前兩個或前三個字母) - ,最終形成的最後一個字我可以使用LY第一或firtst兩個字母 -
u
或um
的樂趣 - 上述正則表達式將返回我的一句話:opium
:)
用手構建的正則表達式是一個兩個測試可以接受的,但我想檢查很多單詞組合,所以,尋找如何生成正則表達式的方式如上。
要建立一個「的縮寫取景器的正則表達式腳本」與以下電話:
acrobuild open:4 icebreaker:3 umbrela:3
正如你所看到的,在ARG遊戲的話,和分隔符後面的數字是最大數信從一開始就可以在首字母縮寫中使用什麼。
現在的問題 - 我完全失去了如何建立給定長度的正則表達式。需要一些提示,想法或想。 - 勾選「需要幫助這裏」 :)
目前我有這樣的:
#!/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);
}
問題的非常漂亮的簡化。 – jm666