You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多行正则表达式无法匹配字符串问题求解

解决Perl正则匹配HTML文本的问题

问题分析

你的正则无法匹配目标字符串,核心有两个问题:

  • 正则末尾的href="rs(\d+)/缺少闭合的",无法匹配完整的href属性内容;
  • 原正则中.*和.+的贪婪匹配组合,容易过度覆盖后续需要匹配的内容,同时没有妥善处理标签间的换行与空白。

修改后的正则与代码

调整正则逻辑,补充必要的匹配部分,修改后的代码如下:

#!/usr/bin/env perl

use 5.036;
use warnings FATAL => 'all';
use autodie ':default';
use Devel::Confess 'color';

sub regex_test ( $string, $regex ) {
    if ($string =~ m/$regex/s) {
        say "$string matches $regex";
        say "提取到的合并目标ID: $1";
    } else {
        say "$string doesn't match $regex";
    }
}
# the HTML text is $s
my $s = '      rs577952184 was merged into
      
        <a target="_blank"
           href="rs59222162">rs59222162</a>
      
';

# 修改后的正则表达式
regex_test ( $s, 'rs\d+ was merged into.*?<a target="_blank".*?href="rs(\d+)"' );

关键修改说明

  • 将.*改为.*?启用非贪婪匹配,避免过度覆盖后续需要匹配的标签内容;
  • 补充"匹配href属性的闭合引号,确保属性内容匹配完整;
  • 保留s修饰符,保证.可以匹配换行符,覆盖文本中的换行空白。

更可靠的方案:使用HTML解析库

不建议用正则解析HTML,HTML结构的灵活性很容易导致正则匹配失效。推荐使用Perl专业的HTML解析模块,比如Mojo::DOM:

#!/usr/bin/env perl
use 5.036;
use Mojo::DOM;
use HTML::Entities qw(decode_entities);

my $s = '      rs577952184 was merged into
      
        <a target="_blank"
           href="rs59222162">rs59222162</a>
      
';

# 先转义HTML实体,再解析DOM
my $dom = Mojo::DOM->new(decode_entities($s));
my $merged_id = $dom->at('a')->attr('href');
say "合并目标ID: $merged_id";

内容的提问来源于stack exchange,提问作者con

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 12:25:19