次のスクリプトを参照してください。
#!/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";
}
あなたのコードには「?」がありません 正規表現に貪欲ではないことを伝える文字。
もう 1 つの方法は、それ自体の前に 'Q' ではないすべての文字を一致させることです。
m/(^[^Q]+)?Q\.pdf/i
編集: 異なる仕様で投稿を編集したため: HTML を解析する必要がある場合は、適切なモジュールを使用することをお勧めします:
正規表現で html を解析または変更しないでください。HTML::Parser のサブクラスの 1 つを参照してください: HTML::TokeParser、HTML::TokeParser::Simple、HTML::TreeBuilder(::Xpath)?、HTML::TableExtract など。に…」と言うのは間違っています。
http://en.wikipedia.org/wiki/Chomsky_hierarchyと
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";