2011-04-21 53 views
1

嘿所以我现在对正则表达式不太好,试图学习,但是有人能够为我解释一点点吗?Perl正则表达式解释

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) - 正则表达式的解释 – 2011-04-21 05:01:35

回答

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

m匹配

/模式定界符

(?:include|require)的比赛,但不能捕捉 '包括' 或 '需要'

(?:_once)?选择ionally匹配,但不能捕捉“_once”

\s* 0或多个空格或制表符,其他的“空白”字符

匹配和捕捉0或任意字符的1,其次是文字$字符, 其次

(.?\$.?) 0或任意字符

;匹配分号

(...)外括号的1 - 捕获整个事情

/模式定界符

gi全球性的,不区分大小写的搜索

+0

为什么寻找0或更多的空间或标签? – noledgeispower 2011-04-21 03:28:16

+0

其实'\ s'不仅仅是空格和标签。它匹配诸如* newline *,* carriage-return * * vertical-tab *之类的空白字符,以及所有Unicode空格字符。有关更多信息,请参见[perldoc perlrecharclass](http://perldoc.perl.org/perlrecharclass.html#Whitespace)。 – 2011-04-21 03:29:40

+0

@noledgeispower:好吧,不要问我,我没有写,我只是解释它 – 2011-04-21 03:31:56

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" 

括号是用来捕捉正则表达式的部分是变量$1$2$3等。?:不允许括号捕捉该部分(因此,您有$2而不是$4与值)。但是,尽管有?:,但外部圆括号仍可捕获整条线。

它看起来像g参数在最后允许多行被捕获。但是,这在我的测试中不起作用。