2012-03-01 65 views
3

我尝试使用Perl的正则表达式
磁铁链接看起来像提取洪流磁铁链接的信息的散列:
Perl的正则表达式匹配信息散列

磁铁:XT =瓮:btih:8AC3731AD4B039C05393B5404AFA6E7397810B4​​1 & DN = ubuntu的+ 11 + 10 + + precise中豹猫+桌面+ CD + I386 & TR = HTTP%3A%2F%2Ftracker.openbittorrent.com%2Fannounce

但有时可能看起来像:
磁体:XT =瓮:btih:8AC3731AD4B039C05393B5404AFA6E7397810B4​​1

部分IM试图提取是8AC3731AD4B039C05393B5404AFA6E7397810B4​​1

我尝试捕捉一切高达第一“&”,或者如果它仅包含信息散列接着一边行结束,我已经尝试了几个方法,但它不能得到正常工作
我有什么下面只捕获的第一个字符

if ($tmpVar =~ m/magnet\:\?xt=urn\:btih\:([[:alnum:]]+?)/i) { 
    $mainRes{'hash'} = $1; 
} 

我也尝试添加& |捕获后$但这只是导致错误
感谢

+0

“只是导致一个错误” - 这种说法基本是没用的。相反,说出具体的错误是什么。 – TLP 2012-03-01 19:29:46

回答

4

你可以使用:

/\burn:btih:([A-F\d]+)\b/i 

或者如果哈希始终是40个字符:

/\burn:btih:([A-F\d]{40})\b/i 
+1

ahh thnx,这是'?'这是拧我 – Kr0nZ 2012-03-01 17:16:35

+0

叶我虽然大约只是将其限制在40个字符,但我认为它有时是32个字符,根据规格(如果我正确读取)日Thnx – Kr0nZ 2012-03-01 17:22:52

+0

@ Kr0nZ,你可以使用'{32,那么。 – Qtax 2012-03-01 17:52:19

2

正如你已经发现了,你不希望使用正则表达式的? 。原因如下:

? in pattern+?使您的正则表达式“非贪婪”,这意味着它将尽可能使用尽可能少的字符,同时仍然匹配您指定的模式。所以

"8AC3731AD4B039C05393B5404AFA6E7397810B41" =~ /(\w+?)/ 

刚刚返回 “8”,而

"8AC3731AD4B039C05393B5404AFA6E7397810B41" =~ /(\w+)/ 

返回整个字符串。

if ($tmpVar =~ m/magnet:\?xt=urn:btih:([[:alnum:]]+)/i) { 
    $mainRes{'hash'} = $1; 
} 
0

这就是为什么CPAN的神给我们URI,解析出部分的URI,您可以然后解析与正则表达式。

#!/usr/bin/perl 
use URI; 
use URI::QueryParam; 
use Data::Dumper; 

my $u = URI->new(shift()); 
my $xt = $u->query_form_hash->{xt}; 

my ($hash) = $xt =~ m{^urn:btih:(.*)$}; 
print "$hash\n"; 

在命令行中设定磁铁URI。