2012-08-17 2 views
1

텍스트 파일에서 식별자를 찾아야합니다.키워드를 제외한 식별자 일치

식별자가 키워드 인 경우 일치하지 않습니다.

for (i=0 ; i< max ; i++) 

내가 얻어야한다 : 예를 들어, 나는 다음의 키워드로 "를"경우

Found: i 
Found: i 
Found: max 
Found: i 

내가보기 미리 주장에 보였다,하지만 난 할 수 wan't 그것이 작동합니다

$IDENTIFIER="(?!(for|while|do))[a-zA-Z_]+[a-zA-Z0-9_]*" 
    while ($entireFile =~ /($IDENTIFIER)/g) 
    { 
      print "Found ($1)" . "\n"; 
    } 

를 내가 얻을 :

Found: or 
Found: i 
Found: i 
Found: max 
Found: i 

이것은 내가 원하는 것을 조용히하지 않는다! 내가 왜 "또는"을 얻는 지 이해하지만 어떻게 그것을 더 똑똑하게 만들고 "for"를 완전히 배제 할 수 있습니까?

답변

1

당신은 당신이 전체 단어 (잠재적 식별자)와 일치하고 있는지 확인 정박 필요 예를 들면 다음과 같습니다. 첫 번째 근사치로는 /\b(?!(?:for|while|do)\b)[A-Za-z_][A-Za-z0-9_]*\b/이 실제로 원하는 것을 수행합니다.

0

댓글을보고 있기 때문에 식별자와 비슷한 것을 찾을 수는 없습니다. 식별자가있을 수있는 식별자 만 찾습니다. 식별자는 "f"직후에 나타날 수 없습니다. 즉, 실제 문제는 당신이 문제를 해결하지 못한다는 것입니다.

문제가 표시되지 않았으므로 문제를 해결하는 데 도움을 줄 수 없습니다. 우리는 단지 맹목적으로 귀하의 질문에 대답 할 수

$ID_START = "[a-zA-Z_]"; 
$ID_CONT = "[a-zA-Z0-9_]"; 
$IDENT = "(?<!$ID_START)(?<!$ID_CONT)(?!(?:for|while|do)(?!$ID_CONT))$ID_START$ID_CONT+"; 

1

에도 펄, 선명도 사항 (. 이것은 또한 "수행"하는 문제를 해결 "할"로 동일하게 취급되지 않았다). 키워드 필터에서 단어 찾기 정규 표현을 분리하여 테스트를 쉽게 읽고 업데이트 할 수있게하는 것이 좋습니다. 또한 많은 키워드를 필터링하려면 개별 목록을 하나의 일반 표현.

use strict; 
use warnings; 

my $entireFile = "for (i=0 ; i< max ; i++)"; 
my @KEYWORDS = ('for', 'while', 'do'); 

while ($entireFile =~ /([a-zA-Z_][a-zA-Z0-9_]*)/g) 
{ 
    my $is_keyword = 0; 
    for my $keyword (@KEYWORDS) 
    { 
     if ($1 eq $keyword) 
     { 
      $is_keyword = 1; 
     } 
    } 
    if (not $is_keyword) 
    { 
     print "Found ($1)" . "\n"; 
    } 
} 
+3

이 답변의 의도에 동의하지만 코드 샘플에 원본보다 성능이 크게 떨어지는 경우 도움이됩니다. 해시를 사용하여 집합 멤버십을 테스트하거나 ('$ keywords {$ _} ++ for @ KEWYWORDS','if (! $ keywords {$ 1})}) 또는 별도의 정규식을 사용하십시오. 조기에 구제조차하지 않는'eq'를위한 루프 테스트와 1과 3 사이에서 할 수있는 것을위한 12 줄의 코드를 사용하지 마십시오. – hobbs

+0

감사합니다. hobbs! 나는 여기서도 배우고있다. 귀하의 설명은 매우 명확하지만, 다음은 전체 재 작성입니다 : 'my $ wholeFile = "for (i = 0; i

+0

잘 보입니다. :) – hobbs