2016-08-31 2 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

Frugal (일명 욕심이 없거나 게으름)은 "가장 짧음"을 의미하지만 여전히 "가장 왼쪽"을 의미합니다. 당신은 다른 상대를 만나 보면 주위 주장을해야합니다

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

몇 가지 방법이 있습니다 내부 TTATG를 얻을 수 있습니다.

하나는 ^.*(TTATG.+?CCATT)이며 끝 부분은 이고, 마지막은입니다.

또 하나는 (TTATG(?:(?!TTATG).)*?CCATT)이며 중첩되지 않은 쌍을 찾습니다.

두 경우 모두 똑같습니다.

(어떤 이유로 당신이 중복 일치 실제로 여기에 당신을 도울 것입니다 생각하면
나는 아마 잘못된 가정 말하고 싶지만.
를) GCTTCTTATGCCCACACACACCCACTCACC는 적어도 .+? 위치에 일치 할 수 있기 때문에

1

.+?GCTTCTTATGCCCACACACACCCACTCACC 일치 5 (여기서 TTATG은 중단됨) 나머지 패턴은 계속 일치합니다.


당신은 다음 중 하나, 아마도 마지막 원하는 :

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

(?:(?!STRING).)*(?:STRING)CHAR[^CHAR]*에이 때문이다.