[英]How to escape dollar sign ($) in a string using perl regex
我正在尝试使用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;
试试这个:
my %special_characters;
$special_characters{"_"} = "\\_";
$special_characters{"\\\$"} = "\\\$";
$special_characters{"{"} = "\\{";
$special_characters{"}"} = "\\}";
$special_characters{"#"} = "\\#";
$special_characters{"%"} = "\\%";
$special_characters{"&"} = "\\&";
看起来很奇怪,对吗? 您的正则表达式需要如下所示:
s/\$/\$/g
在正则表达式的第一部分中,“$”需要被转义,因为它是一个特殊的正则表达式字符,表示字符串的结尾。
正则表达式的第二部分被视为“普通”字符串,其中“$”没有特殊含义。 因此反斜杠是一个真正的反斜杠,而在第一部分,它用于逃避美元符号。
此外,在变量定义中,您需要转义反斜杠以及美元符号,因为它们在双引号字符串中都有特殊含义。
如果您用自己的反斜杠替换每个字符,则不需要哈希。 只需匹配您需要的内容并在其前面添加反斜杠:
s/($re)/"\\$1"/eg;
要为所有字符构建正则表达式, Regexp :: Assemble非常好。
use v5.10.1;
use Regexp::Assemble;
my $ra = Regexp::Assemble->new;
my @specials = qw(_ $ { } # % & );
foreach my $char ( @specials ) {
$ra->add( "\\Q$char\\E" );
}
my $re = $ra->re;
say "Regex is $re";
while( <DATA> ) {
s/($re)/"\\$1"/eg;
print;
}
__DATA__
There are $100 dollars
Part #1234
Outside { inside } Outside
请注意,在第一行输入中,Regexp :: Assemble如何重新排列我的模式。 这不只是我添加的部分粘合在一起:
Regex is (?^:(?:[#$%&_]|\{|\}))
There are \$100 dollars
Part \#1234
Outside \{ inside \} Outside
如果要添加更多字符,只需将字符放在@specials
中@specials
。 其他一切都适合你。
$
在regexp中有特殊含义,即“字符串结束”。 你最好用这样的东西:
# escape special characters, join them into a single line
my $chars = join '', map { "\\$_" } keys %special_characters;
$string =~ s/([$chars])/$special_characters{$1}/g;
另外,perl不喜欢"$"
,更好地使用'$'
(单引号=>无插值)。
更新:对不起,我写的很匆忙=>太多编辑:(
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.