忽略Perl中某些匹配的情况

时间:2012-08-07 01:46:17

标签: perl pattern-matching ignore

问题1

我希望匹配模式dc_abc并替换为dc_ABC,但如果模式为.dc_abc"dc_abc",则应保持不变。

输入文件:

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

OUTPUT_FILE:

.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);

1 个答案:

答案 0 :(得分:2)

您可以使用negative lookaround来匹配断言。您可以告诉正则表达式您要匹配的部分不能跟随文字点或引号。 (?<! )部分是负面的背后隐藏。在其中,我有模式[."],这是一个字符类,其字符不能超出模式的其余部分:

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拥有您需要的所有工具,并由您完成逻辑。尽管如此,我并不特别想在深夜考虑这件事。也许我稍后会想到一些事情。有各种蛮力的方法来处理它,但可能有些聪明。