Загадочное выражение 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