Perl Regex Объяснение - PullRequest
       0

Perl Regex Объяснение

1 голос
/ 21 апреля 2011

Привет. Итак, я не очень хорошо разбираюсь в регулярных выражениях, пытаясь научиться, может ли кто-нибудь объяснить это мне понемногу?

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

Спасибо

Ответы [ 2 ]

3 голосов
/ 21 апреля 2011
m/((?:include|require)(?:_once)?\s*(.?\$.?);)/gi

m соответствует

/ шаблонный разделитель

(?:include|require) соответствует, но не захватывает «включить» или «требовать»

(?:_once)? опционально соответствует, но не захватывает '_once'

\s* 0 или более пробелов или табуляций, другие символы пробела

(.?\$.?) соответствует и захватывает 0 или 1 любого символа, за которым следует буквальный символ $, сопровождаемый 0 или 1 любого символа

; соответствует точке с запятой

(...) внешняя скобка - захватить все

/ разделитель шаблонов

gi глобальный поиск без учета регистра

0 голосов
/ 21 апреля 2011

Мне обычно легко написать тестовую программу, чтобы проверить мои мысли. Может быть, это поможет вам понять, что делает регулярное выражение:

#! /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 в конце позволяет захватывать несколько строк. Однако в моих тестах это не сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...