我需要通过<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
。请找到以下代码
</div>
我尝试过以下代码。但它只能达到<div id="subclass1">
的{{1}}的第一个<div id="class1">(?:(?!<\/div>).)*?</div>
能帮我解决这个问题吗?
我试图捕获的代码是:
{{1}}
答案 0 :(得分:4)
使用正确的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(), "]";
}
答案 1 :(得分:0)
$ 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
答案 2 :(得分:0)
您应该使用适当的HTML / XML解析器。如果你想以任何理由使用正则表达式,嵌套的正则表达式可以帮助你。 (查看perldoc perlre
了解详细信息。)
$re = qr{
(
<div[^>]*>
(?:(??{$re}) | [^<>]*)*
</div>
)
}x;
print "$1\n" if(/$re/o);
答案 3 :(得分:0)
很多人总是说“使用正确的HTML解析器”来解析HTML而不是正则表达式。有些人没有意识到,有些要求需要满足,而这些要求可能需要正则表达式。
<div id=".+?">.*</div>
应该适合你。