【问题标题】:Perl regex, grabbing text between tagsPerl 正则表达式,在标签之间抓取文本
【发布时间】:2012-08-27 22:59:06
【问题描述】:

我有一个看起来像这样的大文件:

<Feed stack_overflow>
   sourceid 32456
   prefeed 1
   <LOG>
     level 1
     cache info
  </LOG>
</Feed>

我想搜索此文件中的任何内容,并检索包含 Feed 标签的所有内容。因此,如果我搜索 32456,我将得到上面代码中的所有内容。

我现在的代码是:

#!/usr/bin/perl
my $input = "<Feed stack_overflow"; #Search string
my $end = "</Feed>"; #End string
open (DATA, "file.config") or die "Error";

my @list = grep /\b$input\b(.*?)\b$end\b/, <DATA>;
chomp @list;
print "$_\n foreach @list;

但我没有得到任何结果,即使我知道我搜索的内容存在。 我已经成功地使用这个正则表达式打印出包含特定字符串的每一行:

my @list = grep /\b$input\b/, <DATA>;

但我需要帮助打印两个标签之间的所有内容。

【问题讨论】:

  • 我建议使用这样的 XML 解析器:metacpan.org/module/XML::Parser
  • 是您的数据 XML,还是只是看起来像?
  • @mirod 看起来就是这样。

标签: regex perl


【解决方案1】:

您的正则表达式逐行处理数据,但您的字符串跨越多行。你可以使用range operator:

while (<$DATA>) {
    print if /$input/ .. /$end/;
}

如果要排除边框线,可以将内线改为

print if (/$input/ .. /$end/) !~ /^1$|E0/}

DATA 是一个预定义的文件句柄。考虑使用不同的名称,或使用词法文件句柄(在我的示例中为 $DATA)。

【讨论】:

  • 我无法让它工作。它编译但不返回任何结果。
  • 您必须将您的open 更改为open my $DATA, '&lt;', 'file.config' or die $!;
【解决方案2】:
#!/usr/bin/perl
my $input = "<Feed stack_overflow"; #Search string
my $end = "</Feed>"; #End string
open (DATA, "file.config") or die "Error";

undef $/; # slurp mode
$_=<DATA>;
close DATA;

@list = m/\b$input\b(.*?)\b$end\b/mg;
map { print "found : $_\n" } @list;

(因原代码错误多次修改)

【讨论】: