如何停止.+在字符的第一个实例而不是在perl中使用正则表达式的最后一个?

rol*_*lls 5 regex perl

我想替换:

'''<font size="3"><font color="blue"> SUMMER/WINTER CONFIGURATION FILES</font></font>'''
Run Code Online (Sandbox Code Playgroud)

附:

='''<font color="blue"> SUMMER/WINTER CONFIGURATION FILES</font>'''=
Run Code Online (Sandbox Code Playgroud)

现在我的现有代码是:

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

然而,最终结果如下:

=''' SUMMER/WINTER CONFIGURATION FILES</font>'''=
Run Code Online (Sandbox Code Playgroud)

现在我可以看到正在发生的事情,它匹配<font size ="..... all the way up to the end of the <font colour blue">的不是我想要的,我希望它停止在第一个实例"不是最后一个,我认为那是什么把那个标记放在那里,但是我已经尝试.+.+?.*和.*?每次都有相同的结果.

任何人都有任何想法我做错了什么?

Mar*_*ers 8

.+? 在所有地方,使每场比赛不贪婪.

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

还要尽量避免使用正则表达式来解析HTML.如果可能,请使用HTML解析器.


Jon*_*Jon 7

你可以.+改为[^"]+(而不是"匹配任何东西","匹配任何不是""的东西......)


Ped*_*lva 4

正如 Mark 所说,只需使用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>
Run Code Online (Sandbox Code Playgroud)

但是,这适用于您的具体情况:

#!/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>
Run Code Online (Sandbox Code Playgroud)