2016-08-31 13 views
-4

この貪欲でないマッチングを考えてみましょう。与えられた:Perlの貪欲でないマッチング

my $seq = "STARTblablablablaSTARTblablablablaSTOP"; 

私は一致したいSTARTblablablablaSTOP非貪欲です。

私は次のことを試してみました:私は何をしないのです

STARTblablablablaSTARTblablablablaSTOP 

すなわち

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

しかし$マッチは常に文字列全体に割り当てられていますか?

+0

これは、$ hitにすべてが一致する最初のキャプチャ変数が割り当てられているためです。あなたは何を試そうとしていますか? – sln

+0

'TTATGCCCACACACACCCACTCACCCATT'を探している文字列を検索するだけではどうですか?またはその文字列動的の一部ですか? '。*(TTAT。*)'を実行することができます。最後に 'TTAT'が出現したい場合は、それ以外のものを使用します。 – chris85

+3

そして、すべてが一致する理由は、CCATTという部分文字列が1つしかないので、貪欲であるかどうかはすべてに一致します。 – sln

答えて

2

Frugal(貪欲でないまたは怠け者ともいう)とは、「最短」を意味しますが、「最も左」です。あなたは他のマッチを見つけるために、ルック周りアサーションを必要とする:

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

いくつかの方法があり、内側TTATGに取得するには。

1つは^.*(TTATG.+?CCATT)で、最後にはが最後にになります。

もう1つは(TTATG(?:(?!TTATG).)*?CCATT)で、ネストされていないペアが見つかります。

あなたの場合、どちらも同じことになります。

もしあなたが重なって一致が実際に私はそれはおそらく間違った前提だと言うだろう
ここのお手伝いをします。
考える何らかの理由で)

1

.+?GCTTCTTATGCCCACACACACCCACTCACC.+?が位置に一致させることができる少なくともあるのでGCTTCTTATGCCCACACACACCCACTCACCと一致しました5(ここでは、TTATGはオフ)、残りのパターンが一致することができます。


次のいずれかの、おそらく最後の1をしたい:(?:STRING)CHARにあるよう

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

(?:(?!STRING).)*[^CHAR]*にあります。

関連する問題