在perl中,如果我有一个字符串$str
并且在$pat
中保存了一个模式,并且我想将$pat
中保存的内容替换为'nothing'
{} 1}}出现在$pat
的末尾,正则表达式将如何显示?我尝试了不同的版本 - $str
那,以及所有变体(s/\$pat$//
,s/$pat$//
,s/\${pat}$//
)都不起作用:|
my $str = " aaa.::aa*bb/bb*cc:1/cc\n xxx.::xx*yy/yy*zz:1/xx\n"; my $pat = "xxx.::xx*yy/yy*zz:1/xx"; $str =~ s/$pat\n$//; print $str;
答案 0 :(得分:2)
如果您的模式包含特殊的正则表达式字符,则需要告诉Perl将它们视为文字 - 例如,使用quotemeta
。
my $str = " aaa.::aa*bb/bb*cc:1/cc\n xxx.::xx*yy/yy*zz:1/xx\n";
my $pat = "xxx.::xx*yy/yy*zz:1/xx";
$pat = quotemeta $pat;
$str =~ s/$pat$/NOTHING/;
print $str;
如果您不想使用$pat
修改quotemeta
,还可以使用适用\Q
的{{1}}和\E
转义字符图案的封闭部分。
quotemeta
答案 1 :(得分:1)
您应该提供更多代码。以下工作对我来说很好:
my $pat = 'foo';
my $str = 'barbarfoo';
$str =~ s/.+\Q$pat\E$/nothing/;
print $str, "\n";
修改:收到有用的评论后,我在上述正则表达式中添加了\Q
和\E
引用。
答案 2 :(得分:0)
这对我有用:
$str =~ s/$pat$//;
答案 3 :(得分:0)
除了我的评论之外,这对我来说是“有用的”:
my $pat = 'this';
my $string = 'not this but this';
$string =~ s/$pat$//;
say $string;
# outputs "not this but"
使用新示例进行更新
你需要quotemeta才能发挥作用:
my $str = " aaa.::aa*bb/bb*cc:1/cc\n xxx.::xx*yy/yy*zz:1/xx\n";
my $pat = quotemeta "xxx.::xx*yy/yy*zz:1/xx";
$str =~ s/$pat\n$//;
print $str;
# now prints : aaa.::aa*bb/bb*cc:1/cc\n