从替换列表中查找并替换文档?

时间:2014-04-25 17:15:26

标签: regex perl

使用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中实现这一点。 搜索和替换始终在一个独特的文档中。

正如你所看到的,我试图取代“ª”字符但总是在某些情况下,有时替换应该是“a”或“e”或“i”或“o”,所以这就是为什么列表是如此巨大,因为正在尝试许多可能性。

3 个答案:

答案 0 :(得分:0)

这需要很长时间,但您可以多次执行替换。您可以将正则表达式列表存储在文件中,并且一次只能从文件中读取可管理数量的正则表达式,然后查看每个正则表达式上执行一次替换的文档。

答案 1 :(得分: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

答案 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;

在哪里说:$ line =〜,用于编写正则表达式的部分是:/// whith修饰符看起来像这个// // mg并查看搜索和替换字段在哪里s / 搜索 / <强>替换 /克;所以每次你写一个不同的正则表达式时,它都是1比1。 在上面的例子中,我们将“e”替换为“i”,然后下一个正则表达式改为“t”为“zzz”

我有点难过,无法给出一个简单的答案。