Многострочное регулярное выражение - PullRequest
0 голосов
/ 03 сентября 2010

Я пытаюсь найти соответствие из этого текста:

<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   

Я хотел бы получить текст после / блогов (например, «bad-business-writing-487»), а также добавленный по строке (имя студента и дата подачи) (например, «Кемберли Рамирес» 2 сентября 2010 11:38 PM ")

Я использую UltraEdit с выражениями Perl.

Ответы [ 4 ]

3 голосов
/ 03 сентября 2010

Я не знаю, что именно вы пытаетесь сопоставить, но вам лучше использовать правильный анализатор 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
0 голосов
/ 05 сентября 2010

Используя PowerGrep в режиме «точка соответствует новой строке», я придумал следующее:

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

(а затем дополнительный поиск обработки) <? А. *?>

0 голосов
/ 03 сентября 2010

Следующие должны работать для нескольких строк:

.*blogs\/(\S+)".*\(\n.*\)*<a.*>(.*)<\/a>(.*)
0 голосов
/ 03 сентября 2010

Модификаторы / s и / m управляют обработкой нескольких строк.смотрите perlretut

Возможно, вы хотите что-то вроде rrr reg.exps с модификатором / s или что-то вроде этого: (не проверено)

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

Использование m ||вместо // чтобы избежать всего ускользнувшего ..

...