如何搜索和替换看起来像Perl变量的文本?

时间:2010-03-18 05:11:20

标签: regex perl search

我真的把我的屁股踢到了这里。我无法弄清楚如何编写搜索和替换将正确找到此字符串。

字符串:

$QData{"OrigFrom"} $Text{"wrote"}:

注意:这是实际的STRING。那些不是变量。我没有写。

我需要用任何东西替换那个字符串。我试过逃避$,{和}。我尝试了各种组合,但它无法正确使用。

有人想在那里捅一下吗?

谢谢!

3 个答案:

答案 0 :(得分:4)

没有人喜欢quotemeta?让Perl弄明白,这样你就不会用所有那些反斜杠拉伤你的眼睛。 :)

 my $string = 'abc $QData{"OrigFrom"} $Text{"wrote"}: def';
 my $escaped = quotemeta '$QData{"OrigFrom"} $Text{"wrote"}:';

 $string =~ s/$escaped/Ponies!/;

 print $string;

答案 1 :(得分:3)

我原本以为将你的正则表达式包裹在\Q / \E(quotemeta开始和结束转义)中就是你需要做的所有事情,但事实证明$(并且@)不是 在\Q...\E个序列中允许(请参阅http://search.cpan.org/perldoc/perlre#Escape_sequences)。

所以你需要做的是分别逃避$个字符,但你可以将其他所有内容包装在\Q ... \E中:

/\$\QQData{"OrigFrom"} \E\$\QText{"wrote"}:\E/

答案 2 :(得分:1)

使用转义字符\的正则表达式将是

s/\$QData\{"OrigFrom"\} \$Text\{"wrote"\}://;

完整的测试代码:

#!/sw/bin/perl     

$_='$QData{"OrigFrom"} $Text{"wrote"}:';

s/\$QData\{"OrigFrom"\} \$Text\{"wrote"\}://;

print $_."\n";

只输出换行符。