正则表达式跨多行

时间:2013-12-02 16:39:49

标签: regex perl

我能够根据您的建议成功提取所有内容。我的问题按预期发布,正则表达式没有正确识别某些东西......非常感谢!!这是我的最终代码......希望它可以帮到某人!

        if($_=~/(Research Interests)/){
            $research = "Research Interest";

            if($_=~m/<h2>Research Interests<\/h2>(.*?)<p>(.*?)<\/p>/gs){
                    @researchInterests = split(/,+/, $2);
                    $count = 1;
                    foreach(@researchInterests){
                            print "$research $count:";
                            print $_. "\n";
                            $count++;
                    }
            }
    }

3 个答案:

答案 0 :(得分:0)

问题是你一次只读一行。你为什么不读完整个文件并与之匹配。

my $file;
{
    local $/;
    $file = <FILE>;
}

答案 1 :(得分:0)

你可以在这一点上获得更多的线路:

while (<FILE>) {
  if (m/Research Interests/) {
    while (<FILE>) {
      if (m/<p>(.*)<p>/) {
        print "Research Interests: $1";
        last;
      }
    }
  }
}

我不知道你的文件是否庞大,但是值得学习不需要一次读取整个文件的技术,这样你就可以处理任意大的文件,或者使用流。

答案 2 :(得分:-1)

如果您必须这样做,可以尝试将换行符分隔符设置为undef:

#!/usr/bin/perl
use warnings;
use strict;

my $infile = 'in.txt';
open my $input, '<', $infile or die "Can't open to $infile: $!";

my $reserch_interests;
$/=undef;
while(<$input>){
        if($_ =~ /(Research Interests)/){
            $reserch_interests = $1;
                if($_=~ m/<p>(.*)<\/p>/){
                        print "Title: $reserch_interests\nInterests: $1\n";
                }
        }

}

打印:

Title: Research Interests
Interests: Data mining, databases, information retrieval