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:" вместо "Дата:"?