Загадочное выражение perl

Я нахожу следующее утверждение в программе Perl (фактически PDL):

/\/([\w]+)$/i;

Может кто-нибудь расшифровать это для меня, ученика в программировании на Perl?

6 ответов

Решение

Конечно, я объясню это изнутри:

\w - соответствует одному символу, который может быть использован в слове (алфавитно-цифровой, плюс '_')

[...] - соответствует одному символу из скобок

[\w] - соответствует одному символу, который может быть использован в слове (здесь как бы избыточно)

+ - соответствует предыдущему символу, повторяется столько раз, сколько возможно, но должно появиться хотя бы один раз.

[\w]+ - соответствует группе символов слова, много раз. Это найдет слово.

(...) группировка. запомните этот набор символов на потом.

([\w]+) - сопоставить слово и запомнить его на потом

$ конец строки. сопоставить что-либо в конце строки

([\w]+)$ - сопоставить последнее слово в строке и запомнить его на потом

\/ - одиночная косая черта '/'. он должен быть экранирован обратной косой чертой, потому что косая черта является особенной.

\/([\w]+)$ - сопоставить последнее слово в строке после косой черты "/" и запомнить слово на потом. Это, вероятно, захватывает каталог / имя файла из пути.

/.../ - сопоставить синтаксис

/.../i - Я имею в виду без учета регистра.

Все вместе сейчас:

/\/([\w]+)$/i; - сопоставить последнее слово в строке и запомнить его на потом; слово должно идти после косой черты. В основном, захватите имя файла из абсолютного пути. Нечувствительная к регистру часть не имеет значения, \w будет уже соответствовать обоим случаям.

Подробнее о регулярном выражении в Perl можно прочитать здесь: http://www.troubleshooters.com/codecorn/littperl/perlreg.htm

И, как указал JRFerguson, YAPE:: Regex:: Explain полезен для токенизации регулярных выражений и объяснения частей.

Вы найдете модуль Yape::Regex::Explain, который стоит установить.

#!/usr/bin/env perl
use YAPE::Regex::Explain;
#...may need to single quote $ARGV[0] for the shell...
print YAPE::Regex::Explain->new( $ARGV[0] )->explain;

Предполагая, что этот скрипт называется rexplain do:

$ ./rexplain '/\/([\w]+)$/i'

...чтобы получить:

The regular expression:

(?-imsx:/\/([\w]+)$/i)

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?-imsx:                 group, but do not capture (case-sensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  /                        '/'
----------------------------------------------------------------------
  \/                       '/'
----------------------------------------------------------------------
  (                        group and capture to \1:
----------------------------------------------------------------------
    [\w]+                    any character of: word characters (a-z,
                             A-Z, 0-9, _) (1 or more times (matching
                             the most amount possible))
----------------------------------------------------------------------
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  /                        '/'
----------------------------------------------------------------------
  \/                       '/'
----------------------------------------------------------------------
  (                        group and capture to \1:
----------------------------------------------------------------------
    [\w]+                    any character of: word characters (a-z,
                             A-Z, 0-9, _) (1 or more times (matching
                             the most amount possible))
----------------------------------------------------------------------
  )                        end of \1
----------------------------------------------------------------------
  $                        before an optional \n, and the end of the
                           string
----------------------------------------------------------------------
  /i                       '/i'
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------

ОБНОВИТЬ:

Смотрите также: /questions/36629943/yaperegexexplain-ne-rabotaet-s-ispolzovaniem-5014/36629955#36629955. Как отмечено там и в документации модуля:

Не поддерживается синтаксис регулярных выражений, добавленный после Perl версии 5.6, особенно любые конструкции, добавленные в 5.10.

/\/([\w]+)$/i;

Это регулярное выражение, и если оно является полным утверждением, оно применяется к $_ переменная, вот так:

$_ =~ /\/([\w]+)$/i;

Выглядит слеш \/сопровождается буквенно-цифровой строкой \w+с последующим концом строки $, Это также захватывает () буквенно-цифровая строка, которая заканчивается в переменной $1, /i в конце концов, делает его нечувствительным к регистру, что не имеет никакого эффекта в этом случае.

Хотя это не помогает "объяснить" регулярное выражение, как только у вас есть тестовый пример, новый Damian Regexp::Debugger это крутая утилита для наблюдения за тем, что на самом деле происходит во время сопоставления. Установите его и затем сделайте rxrx в командной строке, чтобы запустить отладчик, затем введите /\/([\w]+)$/ а также '/r' (например) и наконец m начать сопоставление. Затем вы можете пройти через отладчик, несколько раз нажав Enter. Очень круто!

Это сравнивает $_ за косой чертой, за которой следует один или несколько символов (без учета регистра) и сохраняя их в $1

$_ value     then     $1 value 
------------------------------
"/abcdes"     |       "abcdes"
"foo/bar2"    |       "bar2"
"foobar"      |       undef      # no slash so doesn't match

Онлайн Regex Analyzer заслуживает упоминания. Вот ссылка, чтобы объяснить, что означает ваше регулярное выражение, и вставлена ​​здесь для записи.

Последовательность: сопоставьте все следующие по порядку

/                                                  (slash)
                                               --+
Repeat                                           | (in GroupNumber:1)
   AnyCharIn[ WordCharacter] one or more times   |
                                               --+
EndOfLine
Другие вопросы по тегам