【问题标题】:Perl regexp to find an element inside an elementPerl 正则表达式在元素中查找元素
【发布时间】:2026-01-12 18:45:02
【问题描述】:

我需要通过正则表达式从<div id="class1"></div> 的末尾找到。我的文本中可能也有很多<div>。请在下面找到代码

This is example <div id="class1">This is <div id="subclass1">This is </div> <div id="subclass2">This is </div> This is </div> This is example

我已经尝试了下面的代码。但它只能到达&lt;div id="subclass1"&gt; 的第一个&lt;/div&gt; 有什么可以帮我解决这个问题吗?

我试图捕获的代码是:

<div id="class1">(?:(?!<\/div>).)*?</div>

【问题讨论】:

  • 请不要尝试使用正则表达式解析 HTML。正则表达式不能胜任这项任务。使用 HTML 解析器。 htmlparsing.com/perl.html 有一些 Perl 示例。
  • 必填链接:*.com/questions/1732348 - 阅读此问题的答案
  • 就像大多数人所说的,Perl 中有很多 HTML/XML 模块,但如果你想感觉自己构建了它,可能你会喜欢 Parse::RecDescent

标签: regex perl


【解决方案1】:

使用适当的 HTML 解析器。

use strict;
use warnings;
use feature qw( say );

use XML::LibXML qw( );

my $html = 'This is example <div id="class1">This is <div id="subclass1">This is </div> <div id="subclass2">This is </div> This is </div> This is example';

my $parser = XML::LibXML->new();
my $doc    = $parser->parse_html_string($html);
my $root   = $doc->documentElement();

for my $div ($root->findnodes('//div[@id="class1"]')) {
   say "[", $div->toString(), "]";
}

【讨论】:

  • 感谢您的源代码。可以通过正则表达式实现吗
  • 当然,用'' =~ /(?{ ... })/;包装整个事情
【解决方案2】:
$ echo 'This is example <div id="class1">This is <div id="subclass1">This is </div> <div id="subclass2">This is </div> This is </div> This is example' | sed -n 's/<div id="class1">\(.*\)<\/div>/\1/p'
This is example This is <div id="subclass1">This is </div> <div id="subclass2">This is </div> This is  This is example

【讨论】:

    【解决方案3】:

    您应该使用适当的 HTML/XML 解析器。如果您出于任何原因想使用正则表达式,嵌套正则表达式可以帮助您。 (详情请查看perldoc perlre。)

    $re = qr{
      (
        <div[^>]*>
        (?:(??{$re}) | [^<>]*)*
        </div>
      )
    }x;
    
    print "$1\n" if(/$re/o);
    

    【讨论】:

      【解决方案4】:

      很多人总是说“使用正确的 HTML 解析器”来解析 HTML 而不是正则表达式。有些人没有意识到需要满足一些要求,而这些要求可能需要正则表达式。

      &lt;div id=".+?"&gt;.*&lt;/div&gt; 应该适合你。

      http://regexr.com?33336

      【讨论】: