如何使用perl正则表达式转义字符串中的美元符号($)

Tom*_*ter 16 regex perl special-characters dollar-sign

我正在尝试使用perl正则表达式转义给定字符串中的几个特殊字符.除美元符号外,它适用于所有字符.我尝试了以下方法:

my %special_characters;
$special_characters{"_"} = "\\_";
$special_characters{"$"} = "\\$";
$special_characters{"{"} = "\\{";
$special_characters{"}"} = "\\}";
$special_characters{"#"} = "\\#";
$special_characters{"%"} = "\\%";
$special_characters{"&"} = "\\&";

my $string = '$foobar';
foreach my $char (keys %special_characters) {
  $string =~ s/$char/$special_characters{$char}/g;
}
print $string;
Run Code Online (Sandbox Code Playgroud)

小智 20

试试这个:

my %special_characters;
$special_characters{"_"} = "\\_";
$special_characters{"\\\$"} = "\\\$";
$special_characters{"{"} = "\\{";
$special_characters{"}"} = "\\}";
$special_characters{"#"} = "\\#";
$special_characters{"%"} = "\\%";
$special_characters{"&"} = "\\&";
Run Code Online (Sandbox Code Playgroud)

看起来很奇怪,对吗?您的正则表达式需要如下所示:

s/\$/\$/g
Run Code Online (Sandbox Code Playgroud)

在正则表达式的第一部分中,"$"需要被转义,因为它是一个特殊的正则表达式字符,表示字符串的结尾.

正则表达式的第二部分被视为"普通"字符串,其中"$"没有特殊含义.因此反斜杠是一个真正的反斜杠,而在第一部分,它用于逃避美元符号.

此外,在变量定义中,您需要转义反斜杠以及美元符号,因为它们在双引号字符串中都有特殊含义.

  • 更好的方法:使用`quotemeta()`或`s /\Q $ char\E/...`你应该记住为每个$变量执行此操作,因为正则表达式会对它们进行插值. (2认同)