如何转义字符串中的所有特殊字符(以及单引号和双引号)?

时间:2016-12-20 06:00:09

标签: perl

E.g:

$myVar="this#@#!~`%^&*()[]}{;'".,<>?/\";

我无法导出此变量并将其用于我的程序中。

任何人都可以帮忙吗?

3 个答案:

答案 0 :(得分:5)

如果我了解你的任务,这就是quotemeta的用途。来自链接的文档

  

返回EXPR的值,并将所有非“word”字符反斜杠。 (也就是说,所有不匹配/[A-Za-z_0-9]/的字符都将在返回的字符串中以反斜杠开头,而不管任何语言环境设置。)这是在双引号字符串中实现\Q转义的内部函数。

它的使用非常简单

my $myVar = q(this#@#!~`%^&*()[]}{;'".,<>?/\\);
print "$myVar\n";

my $quoted_var = quotemeta $myVar;
print "$quoted_var\n";

请注意,我们必须手动转义最后一个反斜杠,以防止它转义结束分隔符。或者你可以在最后添加一个额外的空格,然后将其剥离(chop)。

my $myVar = q(this#@#!~`%^&*()[]}{;'".,<>?/\ );
chop $myVar;

现在使用$myVar转换quotemeta,如上所述。

我将外部"对仅表示你在变量中的内容。但是如果它们实际上是在变量中,那么只需将它全部放在q()中,从那以后最后一个字符是"。唯一的问题是在结束分隔符之前的反斜杠。

如果您在正则表达式上下文中需要此功能,则可以使用\Q启动并\E结束转义。

答案 1 :(得分:4)

使用q存储字符并使用quotemeta转义所有字符

my $myVar=q("this#@#!~`%^&*()[]}{;'".,<>?/\");
$myVar = quotemeta($myVar);

print $myVar;

或者使用正则表达式替换来转义所有字符

my $myVar=q("this#@#!~`%^&*()[]}{;'".,<>?/\");
$myVar =~s/(\W)/\\$1/g;
print $myVar;

答案 2 :(得分:-1)

Giving Thanks to

\ Q和\ E之间的内容被视为普通字符,而不是正则表达式字符。例如,

 '.' =~ /./;      # match
 'a' =~ /./;      # match
 '.' =~ /\Q.\E/;  # match
 'a' =~ /\Q.\E/;  # no match

它不会阻止变量被插值。

 $search = '.';
 '.' =~ /$search/;      # match
 'a' =~ /$search/;      # match
 '.' =~ /\Q$search\E/;  # match
 'a' =~ /\Q$search\E/;  # no match