多行正则表达式

时间:2010-09-03 07:57:14

标签: regex perl ultraedit

我正试图匹配本文:

<a href="http://english317.ning.com/profiles/blogs/bad-business-writing-487">Continue</a>
                                      </div>
                <p class="small">

                                                    Added by <a href="/profile/KemberleyRamirez">Kemberley Ramirez</a> on September 2, 2010 at 11:38pm   

我希望获得/ blogs之后的文本(例如“bad-business-writing-487”)以及字符串(学生姓名和提交日期)(例如“Kemberley Ramirez”于2010年9月2日在下午11点38分“)

我正在使用带有Perl表达式的UltraEdit。

4 个答案:

答案 0 :(得分:3)

我不知道你想要匹配的是什么,但你最好使用正确的HTML解析器:

#!/usr/bin/perl

use strict; use warnings;

use HTML::TokeParser::Simple;

my $parser = HTML::TokeParser::Simple->new(\*DATA);

my $blog_re = qr{^http://english317.ning.com/profiles/blogs/(.+)\z};
my $profile_re = qr{^/profile/(\w+)\z};

while ( my $tag = $parser->get_tag('a') ) {
    next unless my ($href) = $tag->get_attr('href');
    if ( $href =~ $blog_re or $href =~ $profile_re ) {
        print "[$1]\n";
    }
}

__DATA__
<a href="http://english317.ning.com/profiles/blogs/bad-business-writing-487">Continue</a>
                                      </div>
                <p class="small">

                                                    Added by <a href="/profile/KemberleyRamirez">Kemberley Ramirez</a> on September 2, 2010 at 11:38pm

答案 1 :(得分:0)

在“dot match newline”模式下使用PowerGrep,我想出了这个:

(?>profiles/blogs/(.*?)").*?added by(.*?)</a>(.*?2010.*?\d{2}[ap]m)

(然后进行额外的处理搜索)     <的a *&GT;??

答案 2 :(得分:-1)

/ s和/ m修饰符控制多行的处理方式。 见perlretut

你可能想要像rrr reg.exps这样的/ s修饰符,或类似的东西:(未经测试)

$foo =~ m|blogs/([^"]+).*Added by <[^>]+>([^<]+)</a>|s

使用m ||而不是//以避免所有逃脱..

答案 3 :(得分:-2)

以下应该适用于多行:

.*blogs\/(\S+)".*\(\n.*\)*<a.*>(.*)<\/a>(.*)