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