複数回マッチする(「/g」修飾子)

オプション修飾子の一つである「/g」を設定すると、パターンが対象の文字列と繰り返しマッチさせることができます。例えば置換演算子を使ってパターンととマッチした部分を別の文字列に置き換える場合、通常は最初にマッチした部分だけを置換しますが「/g」を付けることでマッチしたすべての部分を置換するようになります。ここでは Perl の正規表現で使用する「/g」修飾子の使い方について解説します。

(Last modified: )

「/g」修飾子の使い方

パターンに /g 修飾子を指定するとパターンと繰り返しマッチさせることができます。

m/パターン/g

次のようなパターンを例として考えてみます。

/\b[a-zA-Z]{5}\b/

上記は 単語の境界で始まり、アルファベットが 5 文字続き、最後に単語の境界で終わる文字列にマッチします。それでは次のような文字列を対象にマッチさせてみます。

Table Cup Light Chair Display

このとき次のようなコードを記述することで対象の文字列にマッチする部分を繰り返し取得することができます。

my $str = "Table Cup Light Chair Display";
while ($str =~ /\b\w{5}\b/g) {
  print "$&\n";
}

この場合、 "Table" "Light" "Chair" が順に画面に出力されます。

置換演算子と組み合わせる

置換演算子を使ってパターンとマッチした部分を置換する場合、 /g 修飾子を指定するとパターンとマッチしたすべての部分を置換させることができます。

s/パターン/置き換え文字列/g

※ 正規表現を使った置換を行う方法については「パターンにマッチした部分を別の文字列に置換する」を参照されてください。

通常正規表現を使った置換を行う場合、 /g 修飾子を付けていない場合は最初にマッチした部分だけを置換します。次の例を見てください。

my $str = "Table Cup Light Chair Display";
$str =~ s/\b\w{5}\b/*****/;
print $str;

この場合は最初にマッチした "Table" だけが置換されて "***** Cup Light Chair Display" と画面に出力されます。

今度は /g 修飾子を付けてみます。次の例を見てください。

my $str = "Table Cup Light Chair Display";
$str =~ s/\b\w{5}\b/*****/g;
print $str;

この場合は最初にマッチしたすべての部分が置換されるので "***** Cup ***** ***** Display" と画面に出力されます。

サンプルコード

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

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

my $str = "Table Cup Light Chair Display";
while ($str =~ /\b\w{5}\b/g) {
  print "$&\n";
}

$str =~ s/\b\w{5}\b/*****/g;
print $str;

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

perl sample.pl

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

複数回マッチする(1)

パターンに「/g」修飾子を付けることで、対象の文字列にマッチするすべての部分を順に取得したり、対象の文字列でマッチしたすべての部分を置換することができるようになりました。

-- --

Perl の正規表現で使用する「/g」修飾子の使い方について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

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