regexp优化器

时间:2013-03-11 13:05:15

标签: regex

我有一个简单表达式的大清单(2Mb文件)。例如:
11.*;112.*;113.*;12.*;123.*

我需要删除不必要的表达并提出这个:
11.*;12.*

bash版本将不胜感激。提前谢谢

1 个答案:

答案 0 :(得分:0)

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.*匹配11.*匹配的所有内容,删除后者。

但是,如果引入其他正则表达式模式,这是一种简单的简化,不会工作。这个问题一般没有简单的解决方案,因为您必须解析所有模式并找出每个模式匹配的内容。