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。
我正在尝试匹配 至少 四个 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。