gpt4 book ai didi

regex - sed/perl 中的非贪婪正则表达式匹配

转载 作者:行者123 更新时间:2023-12-01 07:15:03 25 4
gpt4 key购买 nike

我在做sed/http.*.torrent/s/.*(http.*.torrent).*/\1/;/http.*.torrent/p 1.html提取链接。然而,由于 sed 缺少非贪婪量词(这是必需的,因为在该行的后面再次出现“torrent”),试图将其转换为 perl。虽然需要 perl 的帮助。 (或者,如果您知道如何使用 sed 做到这一点,请说出来。)perl -ne s/.*(http.*?.torrent).*/\1/1.html在从 sed 转换后,现在我需要添加这部分:/http.*.torrent/p

这是一部分sed/http.*.torrent/s/.*(http.*.torrent).*/\1/;/http.*.torrent/p 1.html

但这也不起作用; sed 启动但没有退出,当我按下键时,它们有回声,没有别的。

最佳答案

我建议让一个经过充分验证的模块,例如 HTML::LinkExtor为您完成繁重的工作,并使用正则表达式来验证它找到的链接。请参阅下面的示例,了解它是多么简单。

use Modern::Perl;
use HTML::LinkExtor;
use Data::Dumper;

my @links;


# A callback for LinkExtor. Disqualifies non-conforming links, and pushes
# into @links any conforming links.

sub callback {
my ( $tag, %attr ) = @_;
return if $tag ne 'a';
return unless $attr{href} =~ m{http(?:s)?://[^/]*torrent}i;
push @links, \%attr;
}


# The work is done here: Read the html file, parse it, and move on.
undef $/;
my $html = <DATA>;
my $p = HTML::LinkExtor->new(\&callback);
$p->parse( $html );

print Dumper \@links;

__DATA__
<a href="https://toPB.torrent" title="Download this torrent">The goal</a>
<a href="http://this.is.my.torrent.com" title="testlink">Testing2</a> <a href="http://another.torrent.org" title="bwahaha">Two links on one line</a>
<a href="https://toPBJ.torrent.biz" title="Last test">Final Test</a>
A line of nothingness...
That's all folks.

HTML::LinkExtor 可让您设置回调函数。该模块本身会解析您的 HTML 文档以查找任何链接。您正在寻找“a”链接(而不是“img”等)。所以在你的回调函数中你只要尽快退出,除非你有一个'a'链接。然后测试那个“a”链接,看看其中是否有一个“torrent”名称,在适当的位置。如果那个特定的正则表达式不是你需要的,你必须更具体,但我认为这就是你所追求的。当找到链接时,它们会被推送到数据结构中。在我的测试脚本末尾,我打印了结构,这样你就可以看到你有什么。

__DATA__ 部分包含一些示例 HTML 片段,以及用于验证它仅查找链接的垃圾文本。

使用经过良好测试的模块来解析 HTML 比构建脆弱的正则表达式来完成整个工作要持久得多。许多制作精良的解析解决方案在底层都包含正则表达式,但只是在这里和那里做一些零碎的工作。当您开始依赖正则表达式进行解析(而不是识别小构建 block )时,您很快就会耗尽精力。

玩得开心。

关于regex - sed/perl 中的非贪婪正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6415217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com