我有一个这样的字符串:
url.com/my?a=hello&b=world&z=foo
我需要删除a
和b
参数,而不是z
。所以我使用的是以下正则表达式,主要有效:
s#((?<=\?)|(&))(a|b)=\w*(?(2)((?=&)|$)|(&|$))##g
基本上它会检查a
或b
是?
或&
的前缀,它必须以&
结束或者是字符串的结尾。如果它在开头与&
匹配,则最后可能会匹配&
,但不会消耗它。
我遇到的问题是它匹配a
但不匹配b
,如果它们是连续的,那么它会导致:
url.com/my?b=world&z=foo
我想在匹配a
之后,该位置已超过上一个匹配,因此它开始查看b=...
而不再看到后视字符?
,我该如何再次搜索包括非消费字符,还是应该分开替换并独立搜索所有字符串?
答案 0 :(得分:3)
use URI qw( );
use URI::QueryParam qw( );
my $uri = 'http://url.com/my?a=hello&b=world&z=foo';
$uri = URI->new($uri);
$uri->query_param_delete($_) for qw( a b );
print "$uri\n"; # http://url.com/my?z=foo