-1

日付のパターンを一致させるのに苦労しています。次のいずれかの日付が有効です。

 - 121212
 - 4 9 12
 - 5-3-2000
 - 62502
 - 3/3/11
 - 09-08-2001
 - 8 6 07
 - 12 10 2004
 - 4-16-08
 - 3/7/2005

この日付の一致が非常に難しいのは、年が 4 桁である必要がないことです (2 桁の年は 21 世紀であると見なされます、つまり 02 = 2002)。 1 桁の月で、日付がスペース、ダッシュ、またはスラッシュで区切られている場合と区切られていない場合があります。

これは私が現在持っているものです:
/((((0[13578])|([13578])|(1[02]))[\/-]?\s*(([1-9])|(0[1-9])|([12][0-9])|(3[01])))|(((0[469])|([469])|(11))[\/-]?\s*(([1-9])|(0[1-9])|([12][0-9])|(30)))|((2|02)[\/](([1-9])|(0[1-9])|([12][0-9])))[\/-]?\s*(20[0-9]{2})|([0-9]{2}))/g

これはほとんどうまくいきますが、今のところ、日付と月の長さを想定しているかどうか正確にはわかりません. たとえば、 の場合、月がではなく で121212あると想定している可能性があります。また、 と を印刷するとなぜか同じ値になってしまいます。の場合、は、は、は です。しかし、私はなりたいだけです。112$1$2121212$11212$21212$312$1121212

4

4 に答える 4

1

CPANモジュールのTime::ParseDateDateTime62502は、パターンを除いて、おそらくあなたが探しているものです。

use DateTime;
use Time::ParseDate;

foreach my $str (<DATA>) {
    chomp $str;
    $str =~ tr{ }{/};

    my $epoch = parsedate($str, GMT => 1);
    next unless $epoch; # skip 62502

    my $dt = DateTime->from_epoch ( epoch => $epoch );
    print $dt->ymd, "\n";
}

__DATA__
121212
4 9 12
5-3-2000
62502
3/3/11
09-08-2001
8 6 07
12 10 2004
4-16-08
3/7/2005

DateTimeオブジェクトを取得するyearと、、、、monthおよびday情報を簡単に抽出できます。

于 2013-03-13T05:08:52.990 に答える
1

このソリューションは、提供されたすべてのケースを処理します。しかし、問題にはあいまいさがあるため、ソリューションは絶対確実ではありません。たとえば、日付をどのように解釈します12502か? 2002 年 1 月 25 日ですか、それとも 2002 年 12 月 5 日ですか。

use 5.010;
while (my $line = <DATA>) {
    chomp $line;
    my @date = $line =~ /
        \A
        ([01]?\d)   # month is 1-2 digits, but the first digit may only be 0 or 1
        [ \-\/]?    # may or may not have a separator
        ([0123]?\d) # day is 1-2 digits
        [ \-\/]?
        (\d{2,4})   # year is 2-4 digits
        \z
    /x;
    say join '_', @date;
}

__DATA__
121212
4 9 12
5-3-2000
12502
3/3/11
09-08-2001
8 6 07
12 10 2004
4-16-08
3/7/2005
于 2013-03-13T03:03:19.187 に答える
1

mmd を mdd から、または mdccyy を mmddyy から区別できない可能性があるため、タスクはあいまいです。

/ に一致する 1 か所で、スペースまたはダッシュのオプションを省略しました。

うるう年をチェックしていません。

これは実行可能ですが、間違いを犯すのは非常に簡単です。正規表現でそれをやろうとしないのはどうですか。

于 2013-03-13T03:04:49.327 に答える
0

これは、あなたが提供した情報に基づいて私が思いつくことができる最高のものです。すべての可能性に一致し、月/日の範囲と年 (1900 年から 2099 年まで) のエラー チェックがあります。

/(1[012]|0?\d)([-\/ ]?)([12]\d|3[01]|0?\d)\2((19|20)?\d\d)/
于 2013-03-13T03:10:02.550 に答える