2

Perl を初めて使用する PHP プログラマーとして、「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";
}

さて、私の質問に移ります。最初のサブパターンが最小限の量指定子を使用するように変更された理由がわかりません。ちょっとした問題かもしれませんが、なぜそれが行われたのかわかりません。

返信ありがとうございます。

4

6 に答える 6

7

そうでない場合、値に が含まれていると正しく一致しないリスクがあります:<space>

想像:

Subject: Urgent: Need a regex

最小一致がなければ、$1になりSubject: Urgent、 に$2なりますNeed a regex

于 2011-05-19T17:43:19.970 に答える
6

主語が の場合に何が起こるかを考えてみましょうSubject: RE: reply to something

最小量指定子は の後Subjectに停止しますが、貪欲な量指定子は まで一致しREます。

于 2011-05-19T17:43:05.350 に答える
4

最小限の量指定子を使用する理由は、コロン以外を読み取る必要がないためです。実際、そうすべきではありません。これらのキーワードにどのような文字が含まれているかはわかりません.が、幅が広すぎることは確かです。それが問題です。フィールドにコロンが含まれている場合、最小でない正規表現はそれをすべて飲み込んでしまいます。次に例を示します。

Subject: Counter Strike: Source

最初のサブパターンが貪欲だった場合、Subject: Counter Strikeだけでなく も取得しSubjectます。

于 2011-05-19T17:45:40.590 に答える
4

そうしないと、最後の「:」までのすべての文字に一致するためです。たとえば、最小限の量指定子がない場合、次の文字列は次のようになります。

Test: My: Weird: String

最初のグループとして "Test: My: Weird" に一致します。ただし、最小限の量指定子では、「Test」のみに一致します。

于 2011-05-19T17:43:42.760 に答える
0

その最小限の量指定子がなければ、Perl の正規表現はデフォルトで貪欲であるため、「Date:」行から得られる $1 の値は実際には「Date: Mon, 1st Jan 2000 09:00」になります。

于 2011-05-19T17:44:48.637 に答える
0

最小限の量指定子がないと、日付行の最初のキャプチャは、「日付:」ではなく「日付: 2000 年 1 月 1 日 09:00: 月曜日:」になりませんか?

于 2011-05-19T17:43:45.350 に答える