如何从perl中带有正则表达式的字符串中获取匹配的子字符串

时间:2012-04-23 19:46:42

标签: html perl

  

可能重复:
  How can I extract URL and link text from HTML in Perl?

我正在尝试在字符串中获取子字符串。字符串中可能有多个匹配的字符串。

<LI>
<A
 HREF="65378161_12011_Q.pdf"> 
65378161_12011_Q.pdf

</A>

从上面的字符串我想得到文件名“65378161_12011_Q.pdf”。

if($line=~ m/((.*)Q\.pdf)/i ){
          my $inside=$2;
           print " file name:$inside \n";
     }

这是我尝试但它没有得到正确的子字符串。 有人可以帮忙解决这个问题。 如果有人能回答我的问题,我真的很感激。

3 个答案:

答案 0 :(得分:0)

请参阅以下脚本:

#!/usr/bin/env perl

use strict;
use warnings;

my $string = "65378161_12011_Q.pdf";


if($string =~ m/((.*)?Q\.pdf)/i ){
    my $inside=$2;
    print " file name:$inside \n";
}

你的代码只缺少'?'告诉正则表达式不要贪心的角色。

另一种方法是匹配所有不是'Q'的字符:

m/(^[^Q]+)?Q\.pdf/i

修改: 因为您使用不同的规范编辑了帖子: 如果您需要解析HTML,我建议使用适当的模块:

  

不要使用正则表达式解析或修改html!见其中之一   HTML :: Parser的子类:HTML :: TokeParser,HTML :: TokeParser :: Simple,   HTML :: TreeBuilder(:: Xpath)?,HTML :: TableExtract等。如果您的回复   开始“这太过分了。我只想......”你错了。   http://en.wikipedia.org/wiki/Chomsky_hierarchy和   here为什么不在HTML上使用正则表达式

(这是关于使用正则表达式从irc.freenode.org上的#perl频道解析HTML的提醒)

编辑2:

这是一个完整的工作示例:

#!/usr/bin/env perl

use strict;
use warnings;

use HTML::TreeBuilder;

my $tree = HTML::TreeBuilder->new_from_content('
<LI>
<A
 HREF="65378161_12011_Q.pdf"> 
65378161_12011_Q.pdf

</A>
');

$tree->look_down("_tag", "a")->as_text =~ m/(^[^Q]+)Q\.pdf/i && print "$1\n";

答案 1 :(得分:0)

Use a HTML parser.

use strictures;
use Web::Query qw();
my $w = Web::Query->new_from_html(<<'HTML');
<LI>
<A
HREF="65378161_12011_Q.pdf">
65378161_12011_Q.pdf

</A>
HTML

$w->find('a')->attr('href');
# expression returns '65378161_12011_Q.pdf'
$w->find('a')->text;
# expression returns ' 65378161_12011_Q.pdf '

答案 2 :(得分:-1)

从那以后。将匹配所有内容,只需删除它周围的括号。

#!/usr/bin/perl

my $line = "65378161_12011_Q.pdf";

if ($line =~ m/(.*Q\.pdf)/i )
{
  my $inside = $1;
  print "filename = $inside\n";
}

生成正确的输出。

希望它有所帮助。

曼尼