2013-03-11 69 views
-1

我有一個簡單的表達式(2Mb文件)的大列表。例如:
11.*;112.*;113.*;12.*;123.*正則表達式優化器

我需要刪除不必要的表達式,並提出了這一點:
11.*;12.*

bash的版本,將不勝感激。在此先感謝

+0

你將哪些表情歸類爲「不必要」?所有3位數的編號表達式? – 2013-03-11 13:34:18

+1

@ Chirag64:'11. *'已經涵蓋了'112. *'和'113. *'的情況,'12 *'已經涵蓋了'123. *'的情況。簡化爲「11。*; 12. *'。 – nhahtdh 2013-03-11 13:35:49

+0

請更新您的問題1)表達式的語法(您在表達式中使用了哪些功能?)2)您嘗試過什麼? – nhahtdh 2013-03-11 13:37:45

回答

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.*匹配的所有內容,刪除後者。

但是,如果您引入其他正則表達式模式,這是一種簡單的方法,並且將不會工作。對於這個問題一般沒有簡單的解決方案,因爲你必須解析所有模式並找出每個模式匹配的內容。

+0

謝謝。奇蹟般有效 – ky4k0b 2013-03-11 15:51:56