2011-04-21 3 views
1

안녕하세요, 저는 지금 당장 배우지 않으려 고하면서 정규 표현식에 능숙하지 않아요, 누군가 이걸 나를 조금씩 설명 할 수 있을까요?Perl Regex 설명

if ($fileStrings[$stringCount] =~ m/((?:include|require)(?:_once)?\s*\(.*?\$.*?\);)/gi)

감사

+1

[YAPE :: Regex :: Explain] (http://search.cpan.org/~gsullivan/YAPE-Regex-Explain-4.01/Explain.pm) - 정규 표현식에 대한 설명 –

답변

3
m/((?:include|require)(?:_once)?\s*(.?\$.?);)/gi 

m 경기

/ 패턴

(?:include|require)

구분 일치하지만

(?:_once)? 옵트을 '필요'캡처 '를 포함'여부 ionally에 대한 일치하지만 '_once'

\s* 0 개 이상의 공백이나 탭, 경기 및 캡처 0 또는 문자 1, 문자 $ 문자 다음에 다음

(.?\$.?) 다른 "공백"문자

을 캡처하지 0 또는 문자 세미콜론에 대한

; 경기

(...) 외부 괄호 1 - 모든 일을

,691를 캡처

/ 패턴 구분

gi 글로벌, 대소 문자를 구별하지 검색

나는 보통 쉽게 내 생각을 확인하는 테스트 프로그램을 작성 찾을
+0

왜 0을 찾아야합니까? 또는 더 많은 공백이나 탭이 있습니까? – noledgeispower

+0

실제로'\ s'는 단지 공백과 탭 이상에 일치합니다. * newline *, * carriage-return * * vertical-tab *과 같은 공백 문자와 모든 유니 코드 공백 문자를 일치시킵니다. 자세한 내용은 [perldoc perlrecharclass] (http://perldoc.perl.org/perlrecharclass.html#Whitespace)를 참조하십시오. –

+0

@noledgeispower : 글쎄, 나 한테 물어 보지 마, 내가 그것을 작성하지 않았다, 그냥 그것을 설명했다 –

0

. 어쩌면 이것은 당신이 정규식이 무엇을하고 있는지 이해하는 데 도움이 될 것입니다 :

#! /usr/bin/env perl 

use warnings; 
use strict; 
use feature qw(say); 

for my $line (
    'include_once F$G;', 
    'require_once F$G;', 
    'INCLUDE F$G;', 
    'include_once  AF$G;', 
    'include_once F$G;', 
) { 
    if ($line =~ m/((?:include|require)(?:_once)?\s*(.?\$.?);)/gi) { 
     say qq(Line = "$line"); 
     say qq(\$1 = "$1"); 
     say qq(\$2 = "$2"\n); 
    } 
    else { 
     say qq(Line = "$line"); 
     say "No match!\n"; 
    } 
} 

을 그리고 출력은 다음과 같습니다

Line = "include_once F$G;" 
$1 = "include_once F$G;" 
$2 = "F$G" 

Line = "require_once F$G;" 
$1 = "require_once F$G;" 
$2 = "F$G" 

Line = "INCLUDE F$G;" 
$1 = "INCLUDE F$G;" 
$2 = "F$G" 

Line = "include_once  AF$G;" 
No match! 

Line = "include_once F$G;" 
$1 = "include_once F$G;" 
$2 = "F$G" 

괄호는 정규 표현식의 일부를 캡처하는 데 사용됩니다, $3 변수 $1, $2입니다 ?:은 괄호로 해당 부분을 캡처 할 수 없으므로 값이 $4이 아닌 $2이됩니다. 그러나 바깥 쪽 괄호는 ?:에도 불구하고 전체 줄을 캡처합니다.

마지막으로 g 매개 변수가 여러 줄을 캡처 할 수있는 것처럼 보입니다. 그러나, 그건 내 테스트에서 작동하지 않았다.