Perl 正则表达式不匹配重复字符串

Perl regular expression mismatches repetitive strings

我正在尝试匹配 至少 四个 G 重复,每个重复最多由 7 个字符分隔。示例:

AAGGGAAGGGAAAGGGAAGGGAA

我使用下面的正则表达式来匹配大写和小写字符。

$sequence =~ /((G{3,}[ATGC]{1,7}){3,}G{3,})/gi

这应该至少匹配四个 G 重复。问题是,当我匹配以下序列时,我得到了肯定的命中:

aaagaggaaaaggggaaaaggggaaaaggggaaa

此序列中的第一个重复包含三个 g,由 a 分隔。因此,不应匹配此序列。

解决方案一:好像是 /i 修饰符的问题。我可以通过修改正则表达式来纠正它:

 $sequence =~ /(([gG]{3,}[aAtTgGcC]{1,7}){3,}[gG]{3,})/g

ikegami 提供的解决方案 2:否定前瞻。

$sequence =~ /(([?!G]{3,}[ATGC]{1,7}){3,}[G]{3,})/gi

感谢@ikegami 的提示和提交错误报告。

$ perl -E'say $& while "aaagaggaaaaggggaaaaggggaaaaggggaaa" =~ /((G{3,}[ATGC]{1,7}){3,}G{3,})/gi'
gggaaaaggggaaaagggg

您发现了一个错误!我提交了 bug report.

这个错误至少从 5.10 开始就存在,并且出现在最新版本 (5.24.0) 中。

更新:已在 Perl 5.26 中修复,发布于 2017-05-30。