Perl Regex解释

时间:2011-04-21 03:11:28

标签: regex perl

嘿所以我现在对正则表达式并不擅长,试着去学习,有人可以一点一点地为我解释这个吗?

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

由于

2 个答案:

答案 0 :(得分:3)

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

m匹配

/模式分隔符

(?:include|require)匹配但不捕获'include'或'require'

(?:_once)?可选地匹配但不捕获'_once'

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

(.?\$.?)匹配并捕获任何字符的0或1,后跟文字$字符, 后跟0或1的任何字符

;匹配分号

(...)外括号 - 捕获整个事物

/模式分隔符

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

答案 1 :(得分: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参数允许捕获多行。但是,这在我的测试中不起作用。