Perl REGEX Вопрос

Как программист 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 ответов

Решение

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

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

Subject: Urgent: Need a regex

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

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

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

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

Test: My: Weird: String

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

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

Subject: Counter Strike: Source

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

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

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

Другие вопросы по тегам