Perl:替换包含问号的字符串

时间:2013-08-26 17:16:42

标签: regex perl

这是我的代码:

$html = 'Is this a question? Maybe.';
$old = 'question?';
$new = 'reply?';

$html =~ s/$old/$new/g;
print $html; exit;

输出是:

Is this a reply?? Maybe.

期望的输出:

Is this a reply? Maybe.

我做错了什么?谢谢。

3 个答案:

答案 0 :(得分:9)

使用quotemeta转义?

$html = 'Is this a question? Maybe.';
$old = quotemeta 'question?';
$new = 'reply?';

$html =~ s/$old/$new/g;
print $html; exit;

答案 1 :(得分:6)

在正则表达式中,问号是一个运算符,意思是 one或none 。因此,我们必须逃脱它:

s/question\?/reply?/g

请注意,它在字符串中并不特殊。因为将随机字符串插入到正则表达式中会产生不必要的影响,所以首先应quotemeta它们。

  • 使用quotemeta函数:$old = quotemeta "question?"
  • 或者在正则表达式中使用\Q...\E区域:

    s/\Q$old\E/$new/g
    

答案 2 :(得分:2)

?在正则表达式中具有特殊含义。你只需要在你的模式中逃避它:

$old = 'question\?';