Что делает это, если оператор, содержащий очень похожие совпадения регулярного выражения, делает? - PullRequest
1 голос
/ 12 ноября 2009

Что означает эта строка Perl?

if (/ile.*= (\d*)/ || /ile.*=(\d*)/ ) {

Меня особенно интересует, что означает "/ ile" и почему обе стороны || идентичны.

Ответы [ 4 ]

9 голосов
/ 12 ноября 2009

Синтаксис /.../ содержит регулярное выражение . Две стороны || немного отличаются - у второй нет пробела после знака равенства.

Первый /.../ декодируется как «соответствует буквам i, l, e», затем любому символу (.) любое количество раз (*), затем равен (=), затем пробел, то есть захват (скобки), который захватывает ноль или более цифр (\d*).

Соответствие не привязано к переменной Perl, поэтому оно будет соответствовать скаляру по умолчанию $_.

7 голосов
/ 12 ноября 2009

Вы можете переписать это как

if (/ile.*= ?(\d*)/) {

Используйте YAPE :: Regex :: Explain , чтобы понять, чему соответствует данный шаблон.

#!/usr/bin/perl

use strict;
use warnings;

use YAPE::Regex::Explain;

print YAPE::Regex::Explain->new(qr/ile.*= ?(\d*)/)->explain;

Выход:

The regular expression:

(?-imsx:ile.*= ?(\d*))

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):
----------------------------------------------------------------------
  ile                      'ile'
----------------------------------------------------------------------
  .*                       any character except \n (0 or more times
                           (matching the most amount possible))
----------------------------------------------------------------------
  =                        '='
----------------------------------------------------------------------
   ?                       ' ' (optional (matching the most amount
                           possible))
----------------------------------------------------------------------
  (                        group and capture to \1:
----------------------------------------------------------------------
    \d*                      digits (0-9) (0 or more times (matching
                             the most amount possible))
----------------------------------------------------------------------
  )                        end of \1
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------
4 голосов
/ 12 ноября 2009

Вероятно, это очень грубый способ поиска строки, которая выглядит следующим образом:

fileXXX=1234657
fileYYY= 123648

... 'ile' буквально совпадает с этими тремя символами, и две стороны || не совсем идентичны, есть версия с пробелом после = и одна без.

2 голосов
/ 12 ноября 2009

В этом контексте символ «/» не действует как оператор математического деления или как какой-либо префикс (например, для параметров командной строки Windows). Скорее, "/" является обычным символом кавычки для включения регулярных выражений .

Все, что находится между двумя слешами, образует регулярное выражение и не обозначает какой-либо исполняемый код, что подводит нас к тому, что, как я подозреваю, стало еще одним источником путаницы, поскольку мы думаем, что в «=» был какой-то оператор присваивания или равенства , Внутри регулярного выражения это просто обычный символ, как и символ пробела. Пробелы являются значительными, и наличие или отсутствие одного означает, что эти два регулярных выражения не идентичны. Они могут быть объединены в одно регулярное выражение, как показано в ответе Синан, с использованием «?» оператор регулярного выражения.

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