Почему мой Perl регулярное выражение не соответствует тому, что я думаю, что должно? - PullRequest
0 голосов
/ 18 января 2010

Я попробовал следующий фрагмент кода из учебника Роберта по Perl ( текст ссылки ):

> $_='My email address is
> <webslave@work.com>.';
> 
> print "Found it ! :$1:" if /(<*>)/i;

Когда я запустил его, вывод был:

Нашел это! >:

Однако, не должно быть,

Нашел это! : М>:

поскольку 'm' соответствует '0 или более' <', т.е. части' <* 'регулярного выражения "</p>

Кроме того,

$_='My email address is <webslave@work.com>.';
print "Match 1 worked :$1:" if /(<*)/i;

При запуске выдается:

Матч 1 сработал ::

$_='<My email address is <webslave@work.com>.';
print "Match 2 worked :$1:" if /(<*)/i;

Когда выполняется вышеприведенное, вывод:

Матч 2 сработал: <: </p>

Но вывод не должен быть:

Матч 2 сработал ::

поскольку первое совпадение (т. Е. $ 1) - это "", а не "<", как в предыдущем примере. </p>

Ответы [ 5 ]

4 голосов
/ 18 января 2010
if /(<*>)/i;

будет соответствовать 0 или более <символам, за которыми сразу следует> символ ...

поэтому единственное возможное совпадение - это> char, которому предшествует 0

3 голосов
/ 18 января 2010

Ответ на ваш первый вопрос прост, вы не правы.

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

  1. При успешном совпадении регулярное выражение прекращает сопоставление и возвращает результат, который оно считает успешным.
  2. Стандартные квантификаторы (* + ? и {min, max}) являются жадными. это означает, что /<*/ будет соответствовать максимально возможному количеству <<<<<....

Итак, вернемся к регулярному выражению /<*/. При совпадении

My email address is <webslave@work.com>.

Самое начало строки, ^, соответствует регулярному выражению, в результате чего получается пустая строка. Это успешное совпадение, и следующий шаг, ^M, не соответствует вашему регулярному выражению. так вуаля, Perl перестанет совпадать и выдаст пустой результат.

Затем перейдите ко второй строке

<My email address is <webslave@work.com>.

Самое начало строки, ^, соответствует регулярному выражению, в результате чего получается пустая строка. Но , следующий шаг, ^<, все еще соответствует вашему регулярному выражению. а квантификатор * является жадным. Это будет соответствовать как можно больше. В результате получается <.

2 голосов
/ 18 января 2010

С $ 1 вы получаете доступ к первому «захвату» регулярного выражения, причем захват - это то, что заключено в скобки. В вашем примере я думаю, что вы упускаете. <*> соответствует нулю или более символам «<», за которыми следует символ «>», поэтому здесь он соответствует нулю «<» и одному «>». Вероятно, это должно читаться так:

print "Found it ! :$1:" if /(<.*>)/i;

Теперь это соответствует «<», за которым следует ноль или более произвольных символов («.» Соответствует любому символу), за которым следует «>».

1 голос
/ 18 января 2010

Регулярные выражения в Perl работают несколько иначе, чем подстановочные знаки во многих приложениях ОС.

* означает «0 или более из предыдущей вещи». Итак, когда вы делаете

<*>

это значит

"Ноль или более меньше символов, за которыми следует больше, чем символ."

То, что вы хотите, это лучший друг пользователя регулярного выражения: .

<.*>

Это значит

"символ меньше чем, сопровождаемый НИЧЕГО 0 или более раз, сопровождаемый символом больше чем."

Но это, вероятно, также не то, что вы имеете в виду: символ > равен и"любой символ"! К счастью, есть простой способ сказать, что вы на самом деле имеете в виду, что вы * не жадничаете с символом ?:

<.*?>

Это означает: «Символ меньше, за которым следует что-либо, 0 или более раз, пока я не достигну символа>».

Woo!

Есть несколько замечательных веб-сайтов, которые познакомят вас с великим миром регулярных выражений, и один из моих любимых - регулярные выражения.info . Однако для регулярных выражений, специфичных для Perl, вы не можете превзойти классическое Руководство по регулярным выражениям Perl . Учебное пособие по регулярным выражениям Perl помогло многим странникам регулярных выражений отправиться на родину Perl и является отличным ресурсом.

0 голосов
/ 18 января 2010

Лично мне очень нравится шпаргалка на Добавленных байтах .

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