Perl REGEX Вопрос - PullRequest
       27

Perl REGEX Вопрос

2 голосов
/ 19 мая 2011

Как программист PHP, плохо знакомый с Perl, работающий через 'Программирование на Perl', я столкнулся со следующим регулярным выражением:

/^(.*?): (.*)$/;

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

From: person@site.com
To: email@site.com
Date: Mon, 1st Jan 2000 09:00:00 -1000
Subject: Subject here

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

use warnings;
use strict;

my %fields = ();

open(FILE, 'header.txt') or die('Could not open.');

while(<FILE>)
{
    /^(.*?): (.*)$/;
    $fields{$1} = $2;
}

foreach(%fields)
{
    print;
    print "\n";
}

Теперь на мой вопрос.Я не уверен, почему первый подшаблон был изменен для использования минимального квантификатора.Возможно, это небольшой вопрос, с которым нужно зацикливаться, но я не понимаю, почему это было сделано.

Спасибо за любые ответы.

Ответы [ 6 ]

7 голосов
/ 19 мая 2011

Если этого не произошло, есть риск, что оно не будет соответствовать правильно, если значение содержит :<space>.

Представьте себе:

Subject: Urgent: Need a regex

Без минимального совпадения $1 получит Subject: Urgent, а $2 будет Need a regex.

6 голосов
/ 19 мая 2011

Подумайте, что произойдет, если субъект Subject: RE: reply to something.

Минимальный квантификатор остановится после Subject, но жадный квантификатор будет соответствовать до RE.

4 голосов
/ 19 мая 2011

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

Subject: Counter Strike: Source

Если первый подшаблон был жадным, он бы захватил Subject: Counter Strike, а не просто Subject.

4 голосов
/ 19 мая 2011

Потому что в противном случае он будет соответствовать всем символам до последнего символа ':'.Например, без минимального квантификатора эта строка:

Test: My: Weird: String

будет соответствовать «Test: My: Weird» в качестве первой группы.Но с минимальным квантификатором он будет соответствовать только «Test».

0 голосов
/ 19 мая 2011

Без этого минимального квантификатора значение для $ 1, полученное из строки «Дата:», на самом деле было бы «Дата: понедельник, 1 января 2000 09:00» из-за того, что регулярное выражение Perl по умолчанию жадное.

0 голосов
/ 19 мая 2011

Без минимального квантификатора, не будет ли первый захват для строки даты «Дата: Пн, 1 января 2000 09:00:» вместо «Дата:»?

...