古い記事
ランダムジャンプ
新しい記事
Perlの正規表現で「名前付き捕捉」を使うと、マッチした部分に名前をつけておけるのであとから参照するときに便利。

「(?<name>...)」でマッチさせると、ハッシュ「%+」に保存されて、「$+{name}」でアクセスできるのです。同じ正規表現内では「\g{name}」など。

サンプルプログラムです。日付表現にマッチしたら、年、月、日をそれぞれ別途格納。そしてそれを正規化して出力。

サンプルプログラム:
#!/usr/bin/env perl
use strict;
use warnings;

while (<DATA>) {
    chomp;
    if (m{
        (?<Y>[0-9]{4})\s?年\s?
        (?<m>[01]?[0-9])\s?月\s?
        (?<d>[0-3]?[0-9])\s?日
        |
        (?<Y>[0-9]{4})(?<sep>[/.-])
        (?<m>[01]?[0-9])\g{sep}
        (?<d>[0-3]?[0-9])
        }x) {
        printf "$_ => %04d-%02d-%02d\n", $+{Y}, $+{m}, $+{d};
    }
}

__DATA__
good 2014-01-02
good 2014.3.19
bad 2014/1.31
good 2014-1-2
good 2014/2/28
bad 03/21
good 2014年4月9日
bad 2014年4月
bad 2014年3/21

実行結果:「good」の日付にだけマッチし、正規化。
good 2014-01-02 => 2014-01-02
good 2014.3.19 => 2014-03-19
good 2014-1-2 => 2014-01-02
good 2014/2/28 => 2014-02-28
good 2014年4月9日 => 2014-04-09

名前付き捕捉、最近知ったのですが、ほんと便利。