URL参数的正则表达式匹配

时间:2015-01-10 21:04:18

标签: regex perl

我正在尝试提取磁铁链接的名称。这是我的代码:

use strict;
use warnings;
use v5.18.0;

my $link = 'magnet:?xt=urn:btih:CD46E14A7D62A85607D0F38F0CEE6EE7FEA34209&dn=inherent+vice+2014+dvdscr&tr=udp%3A%2F%2Fexplodie.org%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.com%3A1337';

$link =~ m/dn=(.*)&/;
my $link_text = $1;
say $link_text;

生成的$ link_text包含捕获组之后的字符:     固有+副+ 2014 + + DVDSCR XVID + AC3 + EVO&安培; TR = UDP%3A%2F%2Finferno.demonoid.ph%3A3389%2Fannounce

我可以通过后续替换去掉尾随参数:

$link_text =~ s/&.*//;
say $link_text;

返回我正在寻找的内容:     固有+副+ 2014 + DVDSCR

我在第一个正则表达式中做错了什么?

1 个答案:

答案 0 :(得分:2)

*greedy运算符,意味着它将尽可能多地匹配,并且仍然允许正则表达式的其余部分匹配。使用*?表示非贪婪匹配,表示“零或更多 - 最好尽可能少”。

dn=(.*?)&