【问题标题】:How to get a matched substring from a string with regular expression in perl [duplicate]如何在perl中使用正则表达式从字符串中获取匹配的子字符串[重复]
【发布时间】:2012-05-04 10:58:43
【问题描述】:

可能重复:
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";
     }

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

【问题讨论】:

    标签: html perl


    【解决方案1】:

    请参阅以下脚本:

    #!/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_hierarchyhere 为什么不在 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";
    

    【讨论】:

    【解决方案2】:

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

    #!/usr/bin/perl
    
    my $line = "65378161_12011_Q.pdf";
    
    if ($line =~ m/(.*Q\.pdf)/i )
    {
      my $inside = $1;
      print "filename = $inside\n";
    }
    

    产生正确的输出。

    希望对你有帮助。

    曼尼

    【讨论】:

    • 感谢您的建议,这也不起作用,但我再次更改了问题,您能看到请再次检查我的问题,因为输入字符串现在不同
    【解决方案3】:

    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 '
    

    【讨论】:

    • 这是一个漂亮的模块,我还没用过 :)
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签