マッチした文字列全体を取得する($&)

正規表現のパターンが文字列にマッチした場合、文字列のどの部分にマッチしたのかを取得することができます。ここでは Perl の正規表現でマッチした文字列全体を取得する方法について解説します。

(Last modified: )

マッチした文字列全体を取得する

正規表現パターンが対象の文字列にマッチした場合、マッチした部分を取得することができます。パターンがマッチに成功すると、マッチした部分の文字列全体が特別な変数 $& に格納されます。

$&  マッチした文字列が格納される

そのためマッチさせたあとに変数 $& を参照することでマッチした文字列を取得できます。

次の例を見てください。

my $str = "book is 2000yen, cake is 800yen";

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

パターンは \d+yen となっているため数値で構成される文字が 1 文字以上続いたあとに "yen" が続く文字列にマッチします。

今回の場合は "2000yen" にマッチします。よって変数 $& には "2000yen" が格納されます。なお今回の場合は "2000yen" 以外に "800yen" にもマッチしますが最初にマッチが成功した時点で結合演算子( =~ )は評価が終わりますので "2000yen" が格納されることになります。

my $str = "book is 2000yen, cake is 800yen";

if ($str =~ /\d+yen/){
  print "マッチしました\n";
  print "マッチした文字列 : $&\n";
}

なお $& ではなく $1 を使っても取得できます。詳しくは「マッチした複数の文字列を取得($1, $2, ..)」を参照されてください。

サンプルコード

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

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

&check("book is 2000yen, cake is 800yen");
&check("orange is 950yen");

sub check{
  if ($_[0] =~ /\d+yen/){
    print $_[0]." は /\\d+yen/ にマッチします。\n";
    print "マッチした部分は $& です。\n";
  }else{
    print $_[0]." は /\\d+yen/ にマッチしません。\n";
  }
}

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

perl sample.pl

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

マッチした文字列全体を取得する(1)

パターンにマッチした場合、対象の文字列全体の中でマッチした部分を参照して画面に表示しました。

-- --

Perl の正規表現でマッチした文字列全体を取得する方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

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