バージョン5.10.0では、重要なパターンの照合に役立つ名前付きキャプチャグループが導入されました。
(?'NAME'pattern)
(?<NAME>pattern)
名前付きキャプチャグループ。通常のキャプチャ括弧とすべての点で同じ()
ですが、グループはさまざまな正規表現構造(など)で名前で参照でき、または\g{NAME}
を介して一致した後に名前でアクセスできるという追加の事実があります。とハッシュの詳細については、perlvarを参照してください。%+
%-
%+
%-
複数の異なるキャプチャグループが同じ名前を持っている場合$+{NAME}
、は一致で左端に定義されたグループを参照します。
フォーム(?'NAME'pattern)
と(?<NAME>pattern)
は同等です。
名前付きキャプチャグループを使用すると、次のように正規表現内のサブパターンに名前を付けることができます。
use 5.10.0; # named capture buffers
my $block_pattern = qr/
(?<time>(?&_time)) (?&_sp) (?<desc>(?&_desc))
(?(DEFINE)
# timestamp at logical beginning-of-line
(?<_time> (?m:^) [0-9][0-9]:[0-9][0-9])
# runs of spaces or tabs
(?<_sp> [ \t]+)
# description is everything through the end of the record
(?<_desc>
# s switch makes . match newline too
(?s: .+?)
# terminate before optional whitespace (which we remove) followed
# by either end-of-string or the start of another block
(?= (?&_sp)? (?: $ | (?&_time)))
)
)
/x;
のように使用してください
my $text = '00:00 stuff
00:01 more stuff
multi line
and going
00:02 still
have
';
while ($text =~ /$block_pattern/g) {
print "time=[$+{time}]\n",
"desc=[[[\n",
$+{desc},
"]]]\n\n";
}
出力:
$ ./blocks-demo
時間=[00:00]
desc = [[[
もの
]]]
時間=[00:01]
desc = [[[
より多くのもの
マルチライン
と行く
]]]
時間=[00:02]
desc = [[[
まだ
持ってる
]]]