使用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”,所以这就是为什么列表是如此巨大,因为正在尝试许多可能性。
答案 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”
我有点难过,无法给出一个简单的答案。