如何在$ str结束时检查$ var中保存的模式?两个变量都有特殊字符

时间:2009-09-09 11:25:32

标签: regex perl

在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;

4 个答案:

答案 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