Почему это регулярное выражение Perl не захватывает последний символ? - PullRequest
0 голосов
/ 11 марта 2011

let $ PWD = / Unix_Volume / Users / a / b / c / d

Я ожидаю:

echo $PWD | perl -ne 'if( /(\w+)[^\/]/ ){ print $1; }'

для отображения "Unix_Volume".Тем не менее, он отображает "Unix_Volum."Почему регулярное выражение не захватывает последний символ?

Ответы [ 4 ]

8 голосов
/ 11 марта 2011

(\ w +) => Unix_Volum

[^ \ /] => е (не а /)

/ => /

2 голосов
/ 11 марта 2011

Попробуйте:

export PWD=/Unix_Volume/Users/a/b/c/d
perl -MFile::Spec -e'print((File::Spec->splitdir($ENV{_pwd}))[1],"\n")'

Вы всегда должны использовать модули, которые поставляются с Perl, где это возможно. Список их см. perldoc perlmodlib.

1 голос
/ 11 марта 2011

Поскольку \ w не имеет косой черты в своем классе, зачем вам [^ \ /]?

/ (\ w +) / будет делать. Он фиксирует первое вхождение этого класса.

edit : /.*\b(\w+)/ чтобы захватить последнее вхождение.

0 голосов
/ 12 марта 2011

Группа (\w+) жадно сопоставляет и фиксирует символы слова «Unix_Volume», оставляя позицию в / после «Unix_Volume».

Класс [^\/] заставляет двигатель работать в резервном режиме (жадный алгоритм)+ квантификатор выделяет символы, которым он соответствует, чтобы удовлетворить атомы, которые следуют за ним), чтобы соответствовать символу, который не является "/", совпадая с "e" в конце "Unix_Volume".Поскольку совпадающее «e» находится вне группы захвата, у вас остается «Unix_Volum» в $ 1.

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