0

问题 1

我想匹配模式dc_abc并替换为dc_ABC,但如果模式是.dc_abcor "dc_abc",它应该保持不变。

输入文件:

.dc_abc (dc_abc);
.dc_abc({dc_abc});
dc_abc("dc_abc");

输出文件:

.dc_abc (dc_ABC);
.dc_abc({dc_ABC});
dc_ABC("dc_abc");

问题2

在 Perl 中有什么方法可以创建两个数组,例如:

@match_pattern =(!dc_abc , dc_abc: ,dc_abc );
@ignore_pattern = (.dc_abc, {dc_abc});
  • 如果模式属于@match_pattern,则将其替换为dc_ABC
  • 如果模式属于@ignore pattern,不要做任何事情。

输入文件:

.dc_abc(dc_abc, {dc_abc});
!dc_abc(!dc_abc);
dc_abc: (dc_abc:);

输出文件:

.dc_abc(dc_ABC , {dc_abc});
!dc_abc(dc_ABC);
dc_ABC (dc_ABC);
4

1 回答 1

2

您可以使用否定环视来匹配断言。您可以告诉正则表达式您要匹配的部分不能跟随文字点或引号。这(?<! )部分是负面的回顾。在其中,我有 pattern [."],它是一个字符类,其字符不能位于模式的其余部分之前:

use v5.10;

while( <DATA> ) {
    chomp;
    s/(?<![\."])dc_abc/dc_ABC/g;
    say;
    }


__END__
.dc_abc (dc_abc);
.dc_abc({dc_abc});
dc_abc("dc_abc");

这给出了:

.dc_abc (dc_ABC);
.dc_abc({dc_ABC});
dc_ABC("dc_abc");

环视不匹配任何字符,并且 Perl 中的负环视必须是固定宽度(因此,没有量词)。

对于第 2 个问题,Perl 拥有完成此任务所需的所有工具,并由您自己完成逻辑。不过,我并不特别想在这么晚的时候考虑它。也许我以后会想点什么。有各种蛮力方法来处理它,但可能有一些聪明的方法。

于 2012-08-07T03:44:05.813 回答