簡単な式 (2Mb ファイル) の大きなリストがあります。例えば:
11.*;112.*;113.*;12.*;123.*
不要な表現を削除して、これを考え出す必要があります。
11.*;12.*
bash バージョンをいただければ幸いです。前もって感謝します
簡単な式 (2Mb ファイル) の大きなリストがあります。例えば:
11.*;112.*;113.*;12.*;123.*
不要な表現を削除して、これを考え出す必要があります。
11.*;12.*
bash バージョンをいただければ幸いです。前もって感謝します
パターン内のワイルドカードのみが次の形式である場合.*
、Perl で機能するものを次に示します。
#!/usr/bin/perl
use strict;
use warnings;
my %terms;
{
local $/;
%terms = map {$_ => 1} split /;|\n/, <>;
}
foreach my $k1 (keys %terms)
{
foreach my $k2 (keys %terms)
{
if ($k1 ne $k2 and $k1 =~ /^$k2$/)
{
delete $terms{$k1};
last;
}
}
}
print join ';', keys %terms;
ファイルをコマンドライン引数として受け入れます。
これは、キーを相互に比較することによって機能します。各比較では、1 つのキーが文字列として扱われ、もう 1 つのキーが正規表現として評価されます。これは.*
、 がリテラル文字を含むあらゆるものに一致するという事実を利用してい.*
ます。したがって、別のパターンのリテラル文字列に一致する式は、そのパターンが一致するすべての文字列にも一致します。
.*
1 つのパターンに複数の用語がある場合でも機能します。たとえば、1.*1.*
一致するものすべてに11.*
一致すると正しく判断し、後者を削除します。
ただし、これはハックな単純化のようなものであり、他の正規表現パターンを導入すると機能しません。一般に、この問題に対する簡単な解決策はありません。すべてのパターンを解析し、それぞれが何に一致するかを把握する必要があるためです。