重复使用正则表达式中的后视字符进行多次连续替换

时间:2013-05-29 16:54:09

标签: regex perl regex-lookarounds

我有一个这样的字符串:

  

url.com/my?a=hello&b=world&z=foo

我需要删除ab参数,而不是z。所以我使用的是以下正则表达式,主要有效:

  

s#((?<=\?)|(&))(a|b)=\w*(?(2)((?=&)|$)|(&|$))##g

基本上它会检查ab?&的前缀,它必须以&结束或者是字符串的结尾。如果它在开头与&匹配,则最后可能会匹配&,但不会消耗它。

我遇到的问题是它匹配a但不匹配b,如果它们是连续的,那么它会导致:

  

url.com/my?b=world&z=foo

我想在匹配a之后,该位置已超过上一个匹配,因此它开始查看b=...而不再看到后视字符?,我该如何再次搜索包括非消费字符,还是应该分开替换并独立搜索所有字符串?

1 个答案:

答案 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