Пытаетесь понять этот класс символов в скобках для регулярных выражений Perl? - PullRequest
2 голосов
/ 07 ноября 2011

Ниже приведен скрипт, с которым я играл. С помощью скрипта ниже он напечатает a

$tmp = "cd abc/test/.";
if ( $tmp =~ /cd ([\w\/\.])/ ) {
   print $1."\n";
}

НО, если я поменяю его на:

$tmp = "cd abc/test/.";
if ( $tmp =~ /cd ([\w\/\.]+)/ ) {
   print $1."\n";
}

затем печатает: cd abc/test/.

Насколько я понимаю, + соответствует одной или нескольким последовательностям, исправьте меня, если я ошибаюсь, пожалуйста. Но почему в первом случае он соответствует только a? Я думал, что это не должно соответствовать ничего !!

Спасибо.

Ответы [ 2 ]

3 голосов
/ 07 ноября 2011

Вы правы. В первом случае вы соответствуете одному символу из этого класса символов, а во втором - как минимум одному, с максимально возможным количеством после первого.

Первый:

"
cd\            # Match the characters “cd ” literally
(              # Match the regular expression below and capture its match into backreference number 1
   [\w\/\.]       # Match a single character present in the list below
                     # A word character (letters, digits, etc.)
                     # A / character
                     # A . character
)
"

Второй:

"
cd\            # Match the characters “cd ” literally
(              # Match the regular expression below and capture its match into backreference number 1
   [\w\/\.]       # Match a single character present in the list below
                     # A word character (letters, digits, etc.)
                     # A / character
                     # A . character
      +              # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
)
"
3 голосов
/ 07 ноября 2011

В регулярных выражениях символы в скобках учитываются только для совпадения одного символа в данной скобке. Другими словами, [\w\/\.] соответствует ровно одному из следующих символов:

  1. Буквенно-цифровой символ или "_" (\w).
  2. Косая черта (\/ - обратите внимание, что косую черту необходимо экранировать, поскольку она используется в качестве маркера по умолчанию для начала и конца регулярного выражения)
  3. Точка (\. - опять же, экранированная, поскольку . обозначает любой символ, кроме символа новой строки).

Поскольку /cd ([\w\/\.])./ захватывает только один символ в $1, он захватывает первый символ, который в данном случае равен "a".

Вы правы в том, что + допускает совпадение одного или нескольких таких символов. Поскольку регулярные выражения по умолчанию жадно совпадают, вы должны получить все "abc/test/." для $1 во втором совпадении.

Если вы еще этого не сделали, вы можете просмотреть perldoc perlretut.

...