考虑这种非贪婪的匹配;给出:
my $seq = "TTATGCTTCTTATGCCCACACACACCCACTCACCCATT";
我想非贪婪地匹配TTATGCCCACACACACCCACTCACCCATT
。
我尝试了以下内容:
($match) = $seq =~ m/(TTATG.*?CCATT)/;
($match) = $seq =~ m/(TTATG(.*)?CCATT)/;
($match) = $seq =~ m/(TTATG.+?CCATT)/;
但$ match总是分配给整个字符串,即
TTATGCTTCTTATGCCCACACACACCCACTCACCCATT
我错过了什么?
答案 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)
,它会找到一个非嵌套对。
在你的情况下,两者都匹配相同的东西。
(如果出于任何原因,您认为重叠匹配实际上会对您有所帮助 我说它可能是错误的假设。)