Perl非贪心匹配

时间:2016-08-31 15:30:09

标签: regex perl

考虑这种非贪婪的匹配;给出:

my $seq = "TTATGCTTCTTATGCCCACACACACCCACTCACCCATT";

我想非贪婪地匹配TTATGCCCACACACACCCACTCACCCATT

我尝试了以下内容:

($match) = $seq =~ m/(TTATG.*?CCATT)/;
($match) = $seq =~ m/(TTATG(.*)?CCATT)/;
($match) = $seq =~ m/(TTATG.+?CCATT)/;

但$ match总是分配给整个字符串,即

TTATGCTTCTTATGCCCACACACACCCACTCACCCATT

我错过了什么?

3 个答案:

答案 0 :(得分:2)

节俭(又名非贪婪或懒惰)意味着“最短”,但仍然是“最左边”。您需要使用环视断言来查找其他匹配项:

 while ($seq =~ m/(?=(TTATG.*?CCATT))/g) {
    say for $seq, $1;
}

答案 1 :(得分:1)

.+? matched GCTTCTTATGCCCACACACACCCACTCACC because GCTTCTTATGCCCACACACACCCACTCACC is the least .+? can match at position 5 (where TTATG left off) and still allow the rest of the pattern to match.


You want one of the following, probably the last one:

/ ( TTATG (?:(?!TTATG).)* CCATT ) /xs
/ ( TTATG (?:(?!CCATT).)* CCATT ) /xs
/ ( TTATG (?:(?!TTATG|CCATT).)* CCATT ) /xs

(?:(?!STRING).)* is to [^CHAR]* as (?:STRING) is to CHAR.

答案 2 :(得分:0)

要进入内部TTATG,有几种方法。

一个是^.*(TTATG.+?CCATT),到最后,将获得 last

另一个是(TTATG(?:(?!TTATG).)*?CCATT),它会找到一个非嵌套对。

在你的情况下,两者都匹配相同的东西。

如果出于任何原因,您认为重叠匹配实际上会对您有所帮助 我说它可能是错误的假设。