Perl の正規表現の「名前付き捕捉」がとても便利
2014-08-07-1
[Programming]
Perlの正規表現で「名前付き捕捉」を使うと、マッチした部分に名前をつけておけるのであとから参照するときに便利。
「(?<name>...)」でマッチさせると、ハッシュ「%+」に保存されて、「$+{name}」でアクセスできるのです。同じ正規表現内では「\g{name}」など。
サンプルプログラムです。日付表現にマッチしたら、年、月、日をそれぞれ別途格納。そしてそれを正規化して出力。
サンプルプログラム:
実行結果:「good」の日付にだけマッチし、正規化。
名前付き捕捉、最近知ったのですが、ほんと便利。
「(?<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
名前付き捕捉、最近知ったのですが、ほんと便利。