masatoの日記

やっていきます

正規表現で名前付きキャプチャを使う

正規表現パターンがある程度ややこしくなると、後方参照でキャプチャの順番を書くのが大変になります。

そこで番号ではなくて名前でキャプチャを指定できるという名前付きキャプチャを試してみました。

Perlでは(?<name>)とするとキャプチャに名前が付きます。
名前付きキャプチャで補足した結果は%+というハッシュに記憶されるようです。

サンプル。

my $str = '0123 The message: "The weather today is great" is displayed.';

my $p = '\A(?<no>\d+).*?"(?<quoted>.*?)".*\Z';

$str =~ /$p/;

# 名前付きキャプチャは$+{name}で参照できる
my $index = $+{no}; # 0123
my $quoted = $+{quoted}; # The weather today is great

このときの%+をダンプしてみるとこんなふうになってました。

use Data::printer;
p %+;

普通のハッシュです。

Tie::Hash::NamedCaptureというものがあるようです。

{
    no       "0123",
    quoted   "The weather today is great"
} (tied to Tie::Hash::NamedCapture)

感想

キャプチャした箇所をハッシュにまとめられるので、管理しやすそうだと思いました。