後方参照によるパターン内での参照

正規表現パターン内で括弧を記述することで、括弧内のパターンにマッチする部分文字列が記憶されます。このパターンにマッチした部分文字列をパターン内で参照し利用することができます。このようにマッチした部分文字列をパターン内で参照することを後方参照と呼びます。ここでは Perl の正規表現で後方参照を使ったパターン内での参照方法を解説します。

(Last modified: )

後方参照の使い方

正規表現のパターン内で括弧を記述すると、括弧内のパターンにマッチした部分の文字列が記憶されます。記憶された文字列はパターンマッチが完了すると変数 $1 などに格納されプログラムの中で利用することができます。

このパターンにマッチし記憶された文字列をパターン内でも参照することができます。このように記憶された文字列をパターン内で参照することを後方参照と呼んでいます。記憶された文字列は最初に記憶された内容は \1 、次に記憶された内容は \2 のように参照することが可能となります。

では具体的な例として "<h1>" で始まる場合は "</h1>" までを、 "<h2>" で始まる場合は "</h2>" までをマッチさせる正規表現パターンを考えてみます。

/<(h1|h2)>.*<\/\1>/

上記のパターンではまず <(h1|h2)> の部分で <h1> または <h2> のどちらかにマッチします。この時マッチした "h1" または "h2" のどちらかが記憶されます。

次に .* の部分は任意の文字にマッチします。そして <\/\1> の中の \1 の部分は既に記憶された文字列が参照されます。つまり "h1" が記憶されていれば <\/h1> となり "h2" が記憶されていれば <\/h2> となります。( "/" はエスケープが必要なので "\/" となっています)。

このように後方参照を使うと既にマッチした内容を利用してパターンを動的に作成することができます。

サンプルコード

それでは簡単なサンプルを作成します。

use strict;
use warnings;
use utf8;
binmode STDIN, ':encoding(cp932)';
binmode STDOUT, ':encoding(cp932)';
binmode STDERR, ':encoding(cp932)';

&check("Border is <b>20</b>px");
&check("Border is <span><b>20</b>px</span>");

sub check{
  if ($_[0] =~ /<(span|b)>.*<\\/\\1>/){
    print $_[0]." は /<(span|b)>.*<\\\\/\\\\1>/ にマッチします。\n";
    print "マッチした部分は $& です。\n";
  }
}

テキストエディタでプログラムを記述したあと sample.pl という名前で保存します。(文字コードは UTF-8 です)。コマンドプロンプトを起動し、プログラムを保存したディレクトリへ移動したあとで次のように実行します。

perl sample.pl

次のように実行結果が表示されます。

後方参照によるパターン内での参照(1)

後方参照を使用することで、パターンの中で先にマッチした文字列をあとから利用することができます。

-- --

Perl の正規表現で後方参照を使ったパターン内での参照方法を解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。