2016-08-31 5 views
-4

Betrachten Sie dieses nicht gierige Matching; gegeben:Perl nicht gierig passend

my $seq = "STARTblablablablaSTARTblablablablaSTOP"; 

I STARTblablablablaSTOP nicht gierig übereinstimmen soll.

Ich habe versucht, die folgenden:

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

Aber $ passen immer auf die gesamte Zeichenfolge zugeordnet ist, das heißt

STARTblablablablaSTARTblablablablaSTOP 

Was bin ich?

+0

Es ist, weil $ Hit die erste Capture-Variable zugewiesen ist, die alles entspricht. Was versuchst du zu erreichen? – sln

+0

Warum suchen Sie nicht einfach nach der gesuchten Zeichenfolge 'TTATGCCCACACACACCCACTCACCCATT'? oder ist ein Teil dieser String-Dynamik? Du könntest '. * (TTAT. *)', Wenn du das letzte Vorkommen von 'TTAT' willst, dann alles andere. – chris85

+3

Und der Grund, warum alles passt, ist, dass es nur einen Teilstring 'CCATT' gibt, der so gierig ist oder nicht, dass er allem entspricht. – sln

Antwort

2

Frugal (aka nicht gierig oder faul) bedeutet "kürzeste", aber immer noch "ganz links". Sie müssen sehen-um Behauptungen, die anderen Spiele zu finden:

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

an der inneren TTATG Um dorthin zu gelangen ein paar Möglichkeiten sind.

Einer ist ^.*(TTATG.+?CCATT), der bis zum Ende geht, wird die letzte erhalten.

Eine andere ist (TTATG(?:(?!TTATG).)*?CCATT), die ein nicht verschachteltes Paar finden wird.

In Ihrem Fall stimmen beide überein.

(Wenn Sie aus irgendeinem Grund denken überlappende Spiele werden Sie tatsächlich hier helfen
würde ich sagen, es ist wahrscheinlich die falsche Annahme.
)

1

.+?GCTTCTTATGCCCACACACACCCACTCACC abgestimmt, weil GCTTCTTATGCCCACACACACCCACTCACC die am wenigsten .+? an Position bieten kann 5 (wobei TTATG übrig gelassen wurde) und lassen immer noch zu, dass der Rest des Musters übereinstimmt.


Sie möchten eine der folgenden, wahrscheinlich der letzte:

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

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