Как остановить. + На первом экземпляре символа, а не на последнем с регулярными выражениями в perl? - PullRequest
5 голосов
/ 21 декабря 2010

хочу заменить:

'''<font size="3"><font color="blue"> SUMMER/WINTER CONFIGURATION FILES</font></font>'''

С:

='''<font color="blue"> SUMMER/WINTER CONFIGURATION FILES</font>'''=

Теперь мой существующий код:

$html =~ s/\n(.+)<font size=\".+?\">(.+)<\/font>(.+)\n/\n=$1$2$3=\n/gm

Однако в результате это заканчивается:

=''' SUMMER/WINTER CONFIGURATION FILES</font>'''=

Теперь я вижу, что происходит, это соответствует <font size ="..... all the way up to the end of the <font colour blue">, что не то, что я хочу, я хочу, чтобы оно остановилось на первом экземпляре ", а не на последнем, я подумал, что это то, что поставить отметку «там», но я пытался. +. +?. * и. *? каждый раз с одинаковым результатом.

У кого-нибудь есть идеи, что я делаю не так?

Ответы [ 3 ]

8 голосов
/ 21 декабря 2010

Пишите .+? во всех местах , чтобы каждое совпадение не было жадным.

$html =~ s/\n(.+?)<font size=\".+?\">(.+?)<\/font>(.+?)\n/\n=$1$2$3=\n/gm
                ^                ^      ^            ^

Также старайтесь избегать использования регулярных выражений для разбора HTML.Если возможно, используйте HTML-парсер.

7 голосов
/ 21 декабря 2010

Вы можете изменить .+ на [^"]+ (вместо «сопоставить что-либо», «сопоставить все, что не является "» ...

4 голосов
/ 21 декабря 2010

Как сказал Марк, просто используйте для этого CPAN .

#!/usr/bin/env perl

use strict; use warnings;
use HTML::TreeBuilder;

my $s = q{<font size="3"><font color="blue"> SUMMER/WINTER CONFIGURATION FILES</font></font>};

my $tree = HTML::TreeBuilder->new;
$tree->parse( $s ); 
print $tree->find_by_attribute( color => 'blue' )->as_HTML;

# => <font color="blue"> SUMMER/WINTER CONFIGURATION FILES</font>

Это работает для вашего конкретного случая, однако:

#!/usr/bin/env perl

use strict; use warnings;

my $s = q{<font size="3"><font color="blue"> SUMMER/WINTER CONFIGURATION FILES</font></font>};

print $s =~ m{
                 < .+? >
                 (.+)?
                 </.+? >                
             }mx;

# => <font color="blue"> SUMMER/WINTER CONFIGURATION FILES</font>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...