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

P.H*_*son 2 regex perl

这是我的代码:

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

$html =~ s/$old/$new/g;
print $html; exit;
Run Code Online (Sandbox Code Playgroud)

输出是:

Is this a reply?? Maybe.
Run Code Online (Sandbox Code Playgroud)

期望的输出:

Is this a reply? Maybe.
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?谢谢.

too*_*lic 9

使用quotemeta来逃避?:

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

$html =~ s/$old/$new/g;
print $html; exit;
Run Code Online (Sandbox Code Playgroud)


amo*_*mon 6

在正则表达式中,问号是一个运算符,表示一个或没有.因此,我们必须逃脱它:

s/question\?/reply?/g
Run Code Online (Sandbox Code Playgroud)

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