文字クラス内のメタ文字の扱い

文字クラスはブラケット([])内にマッチする文字を列挙しますが、「+」や「-」などのメタ文字は文字クラス内とそれ以外の場所で記述された場合で扱いが異なります。ここでは Perl の正規表現で文字クラス内にメタ文字を記述した場合の扱いについて解説します。

(Last modified: )

ハイフン(-)

文字クラスの [] 内でハイフン( - )を記述した場合は、ハイフンの左側から右側までの連続した範囲を表すメタ文字となります。

/[0-5P]/

上記では "0" , "1" , "2" , "3" , "4" , "5" , "P" のいずれかの文字にマッチします。

[] 内でハイフン(-)を単なる文字の "-" として扱う場合には \ を使ってエスケープします。

/[0\-5P]/

上記では "0" , "-" , "5" , "P" のいずれかの文字にマッチします。

またハイフン( - )が [] 内の先頭に記述されていた場合、ハイフンの左側の値が存在しませんので範囲として意味を持ちません。よってハイフンが [] の先頭に記述されていた場合はエスケープ無しでも単なる文字の "-" となります。 [] 内では文字が記述された順序に意味を持ちませんので、ハイフンを文字として含めたい場合は単に先頭に記述します。

/[-05P]/

上記では "-" , "0" , "5" , "P" のいずれかの文字にマッチします。

ハイフン( - )は文字クラスの [] 以外の場所では特別な意味を持ちませんので単なる文字として扱われます。

/2000-200[7-9]/

上記では [] 内のハイフンは範囲を表すメタ文字ですが、パターンの真ん中あたりにあるハイフンは単なる文字のハイフンです。よって "2000-2007" 、 "2000-2008" 、 "2000-2009" のいずれかにマッチします。

キャレット(^)

文字クラスの [] 内でキャレット( ^ )を先頭に記述した場合は、それ以降に列挙された文字を否定するメタ文字となります。

/[^0-2am]/

上記では "0" 、 "1" 、 "2" 、 "a" 、 "m" 以外の文字にマッチします。

ただし [] 内であっても先頭以外の場所に記述された場合は単なる文字の "^" として扱われます。

/[0-2^am]/

上記では "0" 、 "1" 、 "2" 、 "^" 、 "a" 、 "m" のいずれかの文字にマッチします。

キャレット( ^ )は [] 以外の場所では文字列の先頭にマッチするメタ文字となります。(詳細は「メタ文字「^」:文字列の先頭とマッチする」を参照して下さい)。

/^[^012]xx/

上記では [] 内のキャレット( ^ )は否定を表すメタ文字ですが、 [ の前にあるキャレット( ^ )はパターンが文字列の先頭にある場合だけマッチすることを表すメタ文字です。よって文字列の先頭から "0" 、 "1" 、 "2" 以外の文字から始まり "xx" がその後に続く場合だけマッチします。

「.」「*」「+」「?」「{」「}」「|」「[」

文字クラス以外で使用される下記のメタ文字は文字クラス内では特別な意味を持ちませんので単なる文字として扱われます。

/[.*+?(){}|]/

上記では "." 、 "*" 、 "+" 、 "?" 、 "(" 、 ")" 、 "{" 、 "}" 、 "|" のいずれかの文字にマッチします。

[] 内に "[" が含まれていた場合も単なる文字の "[" として扱われます。(ただし "]" は異なりますので注意して下さい)。

/[0[A]/

上記では "0" 、 "[" 、 "A" のいずれかの文字にマッチします。

「]」「\」

ブラケットの終わりの "]" が [] 内に記述されていた場合、ブラケットがそこで終わってしまいます。

/[0]A]/

そこで "]" を [] 内で文字として記述する場合は \ を使ってエスケープします。

/[0\]A]/

また "\" も [] 内では他の文字のエスケープや文字の集合を表す特別なショートカットとして使用されますので、文字として "\" を [] 内に記述する場合は \ を使ってエスケープします。

/[0\\A]/
サンプルコード

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

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

&check("200.");
&check("200*");
&check("200+");
&check("200?");
&check("200[");
&check("200{");
&check("200}");
&check("200(");
&check("200)");
&check("200|");
&check("200]");
&check("200\\");

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

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

perl sample.pl

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

文字クラス内のメタ文字の扱い(1)

文字クラスのブラケットの中に、メタ文字として使用されている文字を単なる文字としてマッチするように記述し、実際にマッチするかどうかを確認して画面に表示しました。

-- --

Perl の正規表現で文字クラス内にメタ文字を記述した場合の扱いについて解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。