2014-04-25 161 views
0

使用Perl從正在替換的正則表列表中進行替換。查找替換列表中的文檔並進行替換?

我有這樣的名單進行替換,但我得到了超過50.000列表,並在應用程序中我真的有一個「堆棧溢出」的消息,我使用,總是內存不足。

(.*zaz\s+=\s.*z)ª(z$)    \1a\2 
(.*zaz\s+=\s.*z)ª(s$)    \1a\2 
(.*zaz\s+=\s.*s)ª(z$)    \1a\2 
(.*zaz\s+=\s.*s)ª(s$)    \1a\2 
(.*zay\s+=\s.*z)ª(y$)    \1a\2 
(.*zay\s+=\s.*s)ª(y$)    \1a\2 
(.*zax\s+=\s.*z)ª(k$)    \1a\2 
(.*zax\s+=\s.*s)ª(k$)    \1a\2 
(.*zaw\s+=\s.*z)ª(w$)    \1a\2 
(.*zaw\s+=\s.*z)ª(v$)    \1a\2 
(.*zaw\s+=\s.*s)ª(w$)    \1a\2 
(.*zaw\s+=\s.*s)ª(v$)    \1a\2 
(.*zav\s+=\s.*z)ª(v$)    \1a\2 
(.*zav\s+=\s.*s)ª(v$)    \1a\2 
(.*zat\s+=\s.*z)ª(t$)    \1a\2 
(.*zat\s+=\s.*s)ª(t$)    \1a\2 
(.*zas\s+=\s.*z)ª(z$)    \1a\2 
(.*zas\s+=\s.*z)ª(s$)    \1a\2 
(.*zas\s+=\s.*s)ª(z$)    \1a\2 
(.*zas\s+=\s.*s)ª(s$)    \1a\2 
(.*zar\s+=\s.*z)ª(r$)    \1a\2 
(.*zar\s+=\s.*s)ª(r$)    \1a\2 
(.*zaq\s+=\s.*z)ª(q$)    \1a\2 
(.*zaq\s+=\s.*z)ª(k$)    \1a\2 
(.*zaq\s+=\s.*z)ª(c$)    \1a\2 
(.*zaq\s+=\s.*s)ª(q$)    \1a\2 
(.*zaq\s+=\s.*s)ª(k$)    \1a\2 
(.*zaq\s+=\s.*s)ª(c$)    \1a\2 

在左側執行正則表達式,並在右側進行替換。 我想在Perl中實現這一點。 搜索和替換總是在一個獨特的文件。你可以看到,我試圖替換「ª」caracter,但總是在某些情況下,替換應該是「a」或「e」或「我」或「o」,所以這就是爲什麼這個清單非常龐大,因爲它正在嘗試很多可能性。

+0

你能舉出一些你想要匹配和修正的數據類型的例子嗎? – Oesor

回答

0

這將需要很長時間,但您可以多次執行替換。您可以將Regexes列表存儲在文件中,並且一次只能從文件中讀取可管理數量的正則表達式,對每組Regexes執行一次替換的文檔。

0

這些正則表達式中的很多可以使用字符類進行組合。例如,這8個正則表達式:

(.*zaz\s+=\s.*z)ª(z$)    \1a\2 
(.*zaz\s+=\s.*z)ª(s$)    \1a\2 
(.*zaz\s+=\s.*s)ª(z$)    \1a\2 
(.*zaz\s+=\s.*s)ª(s$)    \1a\2 
(.*zas\s+=\s.*z)ª(z$)    \1a\2 
(.*zas\s+=\s.*z)ª(s$)    \1a\2 
(.*zas\s+=\s.*s)ª(z$)    \1a\2 
(.*zas\s+=\s.*s)ª(s$)    \1a\2 

可以被替換爲:

(.*za[sz]\s+=\s.*[sz])ª([sz]$)  \1a\2 
0

我發現瞭如何使多個替換:

use strict; 
use warnings; 
use autodie; 

my $file = 'input.txt'; 
my $newfile = 'new_blah.txt'; 

open my $infh, '<', $file; 
open my $outfh, '>', $newfile; 

while (my $line = <$infh>) { 
# Any manipulation to $line here, such as that regex: 
$line =~ s/e/i/gm; 
$line =~ s/t/zzz/gm; 

print $outfh $line; 
} 

close $infh; 
close $outfh; 

有地方說:$行= 〜,編寫正則表達式的部分是:/// whith修飾符看起來像這樣/// mg並且看看在哪裏搜索和替換字段s/搜索/取代/gm;所以每次你寫一個不同的正則表達式時,它會變爲1. 在上面的例子中,我們將「e」替換爲「i」,那麼下一個正則表達式是「t」替換爲「zzz」

我是有點傷心,不能給出一個簡單的答案。