2012-07-27 5 views
3

내 코드에 sprintf이라는 단어를 찾고 싶습니다. 펄 정규 표현식은 무엇을 사용해야합니까? sprintf_private과 같은 텍스트가있는 일부 줄이 있는데 제외하고 싶지만 단지 sprintf 만 필요합니다.Perl 정규 표현식으로 정확한 단어 찾기

당신은 단어 '국경에서 \b를 사용해야합니다

답변

21

: 당신이 sprintf_private를 포함하지 않는 선에서 sprintf의 모든 항목을 찾으려면 당신은 정규 표현식에 한 쌍의 사용할 수 있습니다,

/\bsprintf\b/ 
6

:

while(my $line = <DATA>) { 
    next if $line =~ m/\bsprintf_private\b/; 
    while($line =~ m/\bsprintf\b/g) { 
     print "[sprintf] found on line $. at column $-[0]\n"; 
    } 
} 

처음에는 sprintf_private을 포함하는 모든 행을 거부합니다. 그런 다음 해당 실격 기가없는 행은 sprintf의 모든 항목을 검색합니다. 발견 된 곳마다 파일의 행과 일치 항목의 시작 열 (sprintf이있는 곳)을 식별하는 메시지가 인쇄됩니다.

$.@- 특수 변수는 perlvar에 설명되어 있습니다. 정규 표현식에 대한 좋은 책은 perlrequickperlretut입니다. 첫 번째 정규식은 매우 간단합니다. 그것은 단지 \b 너비 어설 션을 사용하여 부적합한 부분 문자열이 각 부분에 단어 경계를 갖도록합니다. 두 번째 정규식은 동일한 기술을 사용하지만 한 줄에 두 번 이상 나타날 경우에 대비하여 sprintf의 모든 항목을 반복하기 위해 /g 수정자를 적용합니다.

제로 너비 어설 션 \b\w\W 또는 \W\w 전환이 발생하는 모든 위치와 일치합니다. 문자 클래스 \w에는 모든 알파벳 문자가 포함되어 있으므로 ("all"을 구성하는 요소는 unicode_strings 플래그 또는 /u에 따라 다름) 더하기 밑줄과 숫자 (즉, 식별자에서 허용되는 문자가 무엇이든간에) \b 단어 경계를 찾을 수 있습니다 너무 제한적. 당신이 "간단한"솔루션은 접근 너무 순진 것을 알게되면, 당신은 여분의 마일을 가서 정말이 보이는 정규식을 사용하여 단어 경계로 인정해야하는지 좁힐 수 :

(?<!\p{Alpha})sprintf(?!\p{Alpha}) 

하는 경우를 당신은,이 솔루션은 다음과 같을 것이 경로를 이동하기로 결정했습니다 :

while(my $line = <DATA>) { 
    next if $line =~ m/(?<!\p{Alpha})sprintf_private(?!\p{Alpha})/; 
    while($line =~ m/(?<!\p{Alpha})sprintf(?!\p{Alpha})/g) { 
     print "[sprintf] found on line $. at column $-[0]\n"; 
    } 
} 

이 경기를 거부 제로 폭 부정적인 lookbehind 제로 폭 부정적 예측의 주장을 사용하는 경우 즉시 왼쪽 또는 기본 문자열의 오른쪽에있는 문자 조금 더 순진한 \b을 사용하는 대신 "알파"문자입니다.

+3

"이 답변은 유용하지 않습니다"라는 말을 듣고 싶습니다. 따라서 개선하거나 정당화 할 수 있습니다. 너의 아주 좋은 설명을 위해서 – DavidO

+1

+1. sprintf가 snprint_private *를 포함하지 않는 라인에서 발견된다는 질문을하지 않았기 때문에 downvoted되었을 수도 있습니다. 따라서 이것은 약간의 과잉이라고 간주 될 수 있습니다. – simbabque

+1

@ - array의 좋은 사용 – gaussblurinc

관련 문제