2016-08-31 63 views
-4

考慮這種非貪婪匹配;給定:Perl非貪婪匹配

my $seq = "STARTblablablablaSTARTblablablablaSTOP"; 

我想匹配STARTblablablablaSTOP非貪婪。

我試過如下:

($match) = $seq =~ m/(START.*?STOP)/; 
($match) = $seq =~ m/(START(.*)?STOP)/; 
($match) = $seq =~ m/(START.+?STOP)/; 

但是$匹配總是分配給整個字符串,即

STARTblablablablaSTARTblablablablaSTOP 

我缺少什麼?

+0

這是因爲$ hit被分配了第一個捕獲變量,它匹配所有內容。你想匹配什麼? – sln

+0

爲什麼不直接搜索您要查找的字符串「TTATGCCCACACACACCCACTCACCCATT」?或者是該字符串動態的一部分?如果你想要'TTAT'的最後一次出現,那麼你可以做'。*(TTAT。*)'。 – chris85

+3

而且它匹配所有東西的原因是隻有一個子字符串'CCATT'太貪婪或者不符合一切。 – sln

回答

2

節儉(aka非貪婪或懶惰)意味着「最短」,但仍然「最左」。你需要環視斷言找到其他比賽:

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

要進入內TTATG有幾種方法。

其中一個是^.*(TTATG.+?CCATT),最後會得到最近的

另一個是(TTATG(?:(?!TTATG).)*?CCATT)它將找到一個非嵌套對。

在你的情況,兩者匹配相同的東西。

如果出於任何原因,你覺得重疊的比賽實際上將幫助你在這裏
我想說它可能是錯誤的假設。

1

.+?匹配GCTTCTTATGCCCACACACACCCACTCACC因爲GCTTCTTATGCCCACACACACCCACTCACC是最.+?可以在位置匹配5(其中TTATG停止),並仍然允許其餘模式匹配。


你想以下情況之一,可能是最後一個:

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

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