请问如何获取最后一次匹配的结果及每次匹配的结果

请问如何获取最后一次匹配的结果及每次匹配的结果

221.229.172.231 - - [02/Apr/2008:10:05:04 +0800] "GET /bderror.txt?userip=192.168.1.102&url=[http://see.fofan.com/see/moreerror.html?q=http://see.fofan.com/see/404.html?q=http://see.fofan.com
/see/dnserror.html?q=http://www.eebbk.com/downlist.asp?csid=1804&classid=1805&txt=&txt=#4%5%3%2%&txt=&ecode=400]
&dns=[61.147.37.1%2061.177.7.1%20192.168.1.1]

日志的一行如上格式(格式有限,只能手工断行,以上日志为一行)
特征由彩色标出
现有两个匹配需求
1.获取最后一个html?q=后面的url

2.匹配所有的&txt=  并获取其后边的字符或空


其中 这一行日志中有几个html?q= 及几个&txt= 是不确定的

还请各位帮着解答或给些提示

我怎么一点思路都没有呢,不知道该用那种语法
谢谢了



正则不好用?
匹配url最好用Regexp::Common,可读性好些
第二个如果是我的话可能会改用python来做:)
简单试试吧:

[Copy to clipboard] [ - ]
CODE:
use warnings;
use strict;

my $string='221.229.172.231 - - [02/Apr/2008:10:05:04 +0800] "GET /bderror.txt?userip=192.168.1.102&url=[[url]http://see.fofan.com/see/moreerror.html?q=http://see.fofan.com/see/404.html?q=http://see.fofan.com[/url] /see/dnserror.html?q=http://www.eebbk.com/downlist.asp?csid=1804&classid=1805&txt=&txt=#4%5%3%2%&txt=&ecode=400]';

if ($string =~ m/.*html\?q=(http:\/\/[^&]*)/ ) {
        print "Found URL : $1\n";
}

while ( $string =~ m/&txt=([^&]*)/g ) {
        print "*[$1]*\n";
}



QUOTE:
原帖由 __lxmxn__ 于 2008-4-8 02:26 发表
简单试试吧:

use warnings;
use strict;

my $string='221.229.172.231 - - [02/Apr/2008:10:05:04 +0800] "GET /bderror.txt?userip=192.168.1.102&url=[http://see.fofan.com/see/moreerror.html?q=ht ...

很感谢楼上的解答~

呵呵,我再去看看概念

原来默认最后得到的匹配就是最后一次的匹配,而加了/g后自然捕获每一次匹配。。。。

哎~~~~~