任意の文字を繰り返すパターンを作成する

任意の一文字にマッチするメタ文字「.」と、繰り返しを表す「*」や「+」などのメタ文字を組み合わせることで、任意の文字が繰り返し現れた場合にマッチする正規表現パターンを作成することができます。ここでは Perl の正規表現で任意の文字を繰り返すパターンを作成する方法について解説します。

(Last modified: )

任意の文字の繰り返し

メタ文字の . は任意の文字(改行を除く)にマッチします。またメタ文字の + は直前の文字を 1 回以上繰り返す場合にマッチしします。この 2 つを組み合わせて .+ とすることで任意の文字を 1 回以上繰り返し文字にマッチするようになります。

例として "a" と "b" の間に任意の文字が繰り返し現れるパターンは次のようになります。

/a.+b/

この場合、 "acb" や "a012345b" など "a" で始まり、そのあとに任意の文字が 1 回以上続き、最後に "b" で終わる文字列にマッチさせることができます。

〇 aPb
〇 abowb
〇 a1098opeb

またマッチするかどうかを調べるだけなら気にしなくてもいいのですが、対象の文字列のどの部分にマッチするのかを調べる場合には注意が必要です。詳しくは次のページで解説しますがデフォルトでは最大限にマッチする範囲が多くなる位置でマッチします。例えば次のような文字列とマッチするかどうか調べてみます。

a00b11b22b

パターン /a.+b/ は "a" で始まり、任意の文字が 1 回以上続き、そのあとに "b" が続く文字列とマッチします。そのため "a00b" の部分にも "a00b11b" にも "a00b11b22b" にもマッチします。

a00b
a00b11b
a00b11b22b

このような場合はマッチする範囲が最大にある "a00b11b22b" にマッチします。

※ どの部分にマッチするのかを選択する方法については「欲張りなマッチと控え目なマッチ(最小量指定子)」を参照して下さい。

改行も含めた任意の文字の繰り返し

任意の一文字を表すメタ文字 . は改行(\n)にはマッチしません。そこで改行も含めて任意の文字を繰り返す場合には別の記述方法を使います。

例として "a" と "b" の間に改行も含めた任意の文字が繰り返し現れるパターンは次のようになります。

/a[\d\D]+b/

この場合、文字クラスを表すブラケット [] の中に数字を表す \d と数字以外を表す \D を記述しています。文字クラスは [] に列挙された文字のいずれかにマッチしますので、数字か数字以外のいずれかにマッチすることになりますので結果としてすべての文字にマッチすることになります。

※ 正規表現における文字クラスについては「列挙した文字の一つとマッチする(文字クラス)」を参照して下さい。

同じように /[\w\W]+//[\s\S]+/ でも同じです。また /s修飾子 を使用しても可能ですが、こちらはまた修飾子の箇所で解説します。

サンプルコード

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

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

&check1("aPbPa");
&check1("aP7m3Pa");
&check1("aPo\nrePa");

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

print "----\n";

&check2("aPbPa");
&check2("aP7m3Pa");
&check2("aPo\nrePa");

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

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

perl sample.pl

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

任意の文字を繰り返すパターンを作成する(1)

任意の文字を繰り返すパターンを 2 つ作成しました。最初のパターンでは任意の文字を繰り返すパターンとして .+ を使用したので改行にはマッチしませんでした。次のパターンでは [\d\D]+ を使用したので改行も含めてマッチしました。

-- --

Perl の正規表現で任意の文字を繰り返すパターンを作成する方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

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