嘿所以我现在对正则表达式并不擅长,试着去学习,有人可以一点一点地为我解释这个吗?
if ($fileStrings[$stringCount] =~ m/((?:include|require)(?:_once)?\s*\(.*?\$.*?\);)/gi)
由于
答案 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
参数允许捕获多行。但是,这在我的测试中不起作用。