多行正则表达式无法匹配字符串问题求解
解决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
相关产品推荐
相关产品推荐

