我正在使用 Perl 替换
../../../../../../abc'
和 
在一个字符串中
/
和
,分别。
我使用的方法如下所示:
sub encode
{
my $result = $_[0];
$result =~ s/..\/..\/..\/..\/..\/..\//\//g;
$result =~ s/ / /g;
return $result;
}
这个对吗?
我正在使用 Perl 替换
../../../../../../abc'
和 
在一个字符串中
/
和
,分别。
我使用的方法如下所示:
sub encode
{
my $result = $_[0];
$result =~ s/..\/..\/..\/..\/..\/..\//\//g;
$result =~ s/ / /g;
return $result;
}
这个对吗?
本质上,是的,尽管第一个正则表达式必须以不同的方式编写:因为.
匹配任何字符,我们必须对其进行转义\.
或将其放入自己的字符类[.]
中。第一个正则表达式也可以写成更简洁
...;
$result =~ s{ (?: [.][.]/ ){6} }
{/}gx;
...;
我们寻找../
重复6
多次的文字模式,然后替换它。因为我使用花括号作为分隔符,所以我不必转义斜线。因为我使用了/x
修饰符,所以我可以在正则表达式中使用这些空格来提高可读性。
尝试这个。它将打印/foo bar/baz
.
#!/usr/bin/perl -w
use strict;
my $result = "../../../../../../foo bar/baz";
#$result =~ s/(\.\.\/)+/\//g; #for any number of ../
$result =~ s/(\.\.\/){6}/\//g; #for 6 exactly
$result =~ s/ / /g;
print $result . "\n";
你忘了ABC,我想:
sub encode
{
my $result = $_[0];
$result =~ s/(?:..\/){6}abc/\//g;
$result =~ s/ / /g;
return $result;
}