パターン内での変数展開

正規表現パターンはダブルクオーテーションで囲った文字列と同じように扱われるため、ダブルクオーテーションで囲われた文字列の中に変数を記述した場合と同じくパターン内に変数を記述した場合は変数展開が行われます。ここでは Perl の正規表現でパターン内での変数展開について解説します。

(Last modified: )

パターン内での変数展開

パターンはダブルクオーテーションで囲った文字列と同じように扱われます。その為、ダブルクオーテーションで囲われた文字列の中に変数を記述した場合と同じくパターン内に変数を記述した場合は変数展開が行われます。(文字列中の変数展開については「文字列中の変数展開」を参照して下さい)。

具体的な例で考えてみます。

my $pat = "And";
my $str = "RedAndBlue";

if ($str =~ /$pat/){
  print "マッチしました。\n";
}

上記ではパターンとして変数名が記述されています。この場合、変数 $pat に格納された値が変数展開され次のように記述した場合と同じになります。

my $str = "RedAndBlue";

if ($str =~ /And/){
  print "マッチしました。\n";
}

このようにパターンの中に変数を記述することで、パターンを動的に作成することができます。

先ほどは変数名だけをパターン内で指定しましたが、他のパターンと組み合わせることも可能です。

my $pat = "and";
my $str = "RedAndBlue";

if ($str =~ /Red$pat/){
  print "マッチしました。\n";
}

この場合、変数 $pat に格納された値が変数展開され次のように記述した場合と同じになります。

my $str = "RedAndBlue";

if ($str =~ /RedAnd/){
  print "マッチしました。\n";
}

また変数名のあとにすぐにアルファベットが続く場合など、変数と他のパターン内の文字の区切りが明確で無い場合は、文字列の中に変数を記述する場合と同じく $ 以降の変数名を {} で括って下さい。

my $pat = "And";
my $str = "RedAndBlue";

if ($str =~ /${pat}Blue/){
  print "マッチしました。\n";
}

この場合、変数 $pat に格納された値が変数展開され次のように記述した場合と同じになります。

my $str = "RedAndBlue";

if ($str =~ /RedBlue/){
  print "マッチしました。\n";
}
サンプルコード

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

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

my $pat = "(J|j)ava";

&check("JavaScript");
&check("javaScript");
&check("javascript");

sub check{
  if ($_[0] =~ /${pat}Script/){
    print $_[0]." は /${pat}Script/ にマッチします。\n";
  }else{
    print $_[0]." は /${pat}Script/ にマッチしません。\n";
  }
}

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

perl sample.pl

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

パターン内での変数展開(1)

パターンの中に変数が記述されているため、パターンの中で変数展開されました。文字列とマッチするかどうか調べる場合は、変数展開が終わったあとのパターンとマッチするか調べられます。

-- --

Perl の正規表現でパターン内での変数展開について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

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