Что означают эти регулярные выражения Perl? - PullRequest
0 голосов
/ 19 июня 2009

Что означает следующий синтаксис в Perl?

$line =~ /([^:]+):/;

и

$line =~ s/([^:]+):/$replace/;

Ответы [ 7 ]

11 голосов
/ 19 июня 2009

См. perldoc perlreref

[^:]

- это класс символов, который соответствует любому символу, кроме ':'.

[^:]+

означает совпадение с одним или несколькими такими символами.

Я не уверен, что нужны круглые скобки. В любом случае

([^:]+):

захватывает последовательность из одного или нескольких символов, отличных от двоеточия, за которыми следует двоеточие.

4 голосов
/ 19 июня 2009
$line =~ /([^:]+):/;

Оператор = ~ называется оператором связывания , он выполняет регулярное выражение или подстановку для скалярного значения (в данном случае $ line). Что касается самого регулярного выражения, () указывает захват. Захваты помещают текст, который соответствует им, в специальные глобальные переменные. Эти переменные пронумерованы, начиная с единицы, и соответствуют порядку, в котором отображаются скобки, поэтому задано

"abc" =~ /(.)(.)(.)/;

переменная $1 будет содержать "a", переменная $2 будет содержать "b", а переменная $3 будет содержать "c" (если вы еще не догадались, . соответствует одному символу *). [] указывает класс персонажа. Классы символов будут соответствовать одному символу в них, поэтому /[abc]/ будет соответствовать одному символу, если это "a", "b" или "c". Классы персонажей можно отменить, начав их с ^. Класс отрицанных символов соответствует одному символу, который не указан в нем, поэтому [^abc] будет соответствовать одному символу, который не "a", "b" или "c" (например, "d" будет соответствовать). + называется квантификатором. Квантификаторы сообщают вам, сколько раз предыдущий шаблон должен совпадать. + требует, чтобы шаблон совпадал один или несколько раз. (для квантификатора * шаблон должен соответствовать нулю или более раз). : не имеет особого значения для движка регулярных выражений, поэтому он означает буквально :.

Итак, сложив эту информацию вместе, мы увидим, что регулярное выражение будет соответствовать одному или нескольким символам, отличным от двоеточия (сохраняя эту часть в $1), за которым следует двоеточие.

$line =~ s/([^:]+):/$replace/;

Это замена. Подстановки состоят из двух частей: регулярного выражения и строки замены. Часть регулярных выражений следует всем тем же правилам, что и обычные регулярные выражения. Запасная часть обрабатывается как строка в двойных кавычках. Подстановка заменяет все, что соответствует регулярному выражению, заменой, поэтому, учитывая следующий код

my $line    = "key: value";
my $replace = "option";

$line =~ s/([^:]+):/$replace/;

Переменная $ line будет содержать строку "option value".

Возможно, вам будет полезно прочитать perldoc perlretut.

* за исключением новой строки, если не используется опция / m, и в этом случае она соответствует любому символу

3 голосов
/ 19 июня 2009

Возможно, я неправильно понимаю некоторые из предыдущих ответов, но я думаю, что во втором примере есть путаница. Он будет не заменять только захваченный элемент (т. Е. Один или несколько двоеточий до двоеточия) на $. Он заменит все ([^:]+): на $replace - двоеточие. (Подстановка действует на матч, а не только на захват.)

Это означает, что если вы не включите двоеточие в $replace (и вы хотите один), вы получите бит:

my $line = 'http://www.example.com/';
my $replace = 'ftp';
$line =~ s/([^:]+):/$replace/;
print "Here's \$line now: $line\n";

Выход:

Here's $line now: ftp//www.example.com/ # Damn, no colon!

Я не уверен, что вы просто смотрите пример кода, но если вы не планируете использовать захват, я не уверен, что вы действительно хотите его в этих примерах.

Если вы очень незнакомы с регулярными выражениями (или Perl), вам следует взглянуть на perldoc perlrequick, прежде чем пытаться perldoc perlre или perldoc perlretut .

3 голосов
/ 19 июня 2009

Первый захватывает часть перед двоеточием из строки, например «abc» в строке «abc: foo». Точнее, он соответствует как минимум одному символу, не являющемуся двоеточием (хотя и как можно большему числу), непосредственно перед двоеточием и помещает их в группу захвата.

Второй заменяет указанную часть, хотя на этот раз , включая двоеточие, содержимым переменной $replace.

1 голос
/ 23 июня 2009

perl -MYAPE :: Regex :: Explain -e "напечатать YAPE :: Regex :: Explain-> new ('([^:] +):') -> объяснение"

The regular expression:

(?-imsx:([^:]+):)

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:
----------------------------------------------------------------------
    [^:]+                    any character except: ':' (1 or more
                             times (matching the most amount
                             possible))
----------------------------------------------------------------------
  )                        end of \1
----------------------------------------------------------------------
  :                        ':'
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------
1 голос
/ 19 июня 2009

Вы хотите вернуть что-то, совпадающее с одним или несколькими символами, но не следующими: с последующим:: и вторым вы хотите сделать то же самое, но заменить его на $ replace.

0 голосов
/ 19 июня 2009
$line =~ /([^:]+):/;

Соответствует всему, что не содержит: before: /

Если $ line = "http://www.google.com",, это будет соответствовать http (переменная $ 1 будет содержать http)

$line =~ s/([^:]+):/$replace/;

На этот раз замените значение, совпадающее с содержимым переменной $ replace

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