正则表达式的Perl文件处理优化

joe*_*joe 0 regex perl

我正在阅读超过百万行的百万文件.

但是已经尝试使用常规表现来替换它们.

我的琴弦是("老虎","狮子","猴子")并用字符串"动物"代替它们;

我已经使用正则表达式替换

$line =~ s/tiger/animal/g;
$line =~ s/lion/animal/g;
$line =~ s/monkey/animal/g;
Run Code Online (Sandbox Code Playgroud)

处理时,执行期间需要花费大量时间.

在这里,我想了解为什么这很慢,我怎样才能更快地解决这个问题呢?

我无法使用任何外部模块来解决此问题.

fge*_*fge 5

使用正则表达式的"预编译形式":

my $regex = qr/\b(?:tiger|lion|monkey)\b/;

# in your loop:
$line ~= s/$regex/animal/g;
Run Code Online (Sandbox Code Playgroud)

注意:正则表达式已缩减为单个正则表达式,并且使用非捕获组(?:...),因为捕获的文本没有用处.此外,还添加了单词锚点(这意味着monkey将匹配,但不会greasemonkey,例如).如果您还想替换复数s?,请在最后一个之前添加\b.

然而,这只关注正则表达式部分:你还谈到其他类型的处理,也许整个过程可以以某种方式改变,以便最终更快.