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

広告

文字クラスはブラケット([])内にマッチする文字を列挙しますが、[]内とそれ以外の場所でメタ文字の扱いが異なります。ここでは一つ一つ確認しておきます。

ハイフン(-)

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

/[0-9P]/

上記では「0,1,2,3,4,5,6,7,8,9,P」のいずれかの文字にマッチします。

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

/[0¥-9P]/

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

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

/[-09P]/

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

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

/2000-200[1-3]/

上記では[]内のハイフンは範囲を表すメタ文字ですが、パターンの真ん中あたりにあるハイフン(-)は単なる文字のハイフン(-)です。よって「2000-2001」「2000-2002」「2000-2003」にマッチします。

キャレット(^)

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

/[^0-4abc]/

上記では「0,1,2,3,4,a,b,c」以外のの文字にマッチします。

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

/[0-4^abc]/

上記では「0,1,2,3,4,^,a,b,c」のいずれかの文字にマッチします。

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

/^[^012]xx/

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

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

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

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

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

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

/[0[A]/

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

「]」「¥」

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

/[0]A]/

そこで「]」を[]内で記述する場合は「¥」を使ってエスケープします。

/[0¥]A]/

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

/[0¥¥A]/

その他

他にもいくつかありますので、随時このページは更新していきます。

サンプルプログラム

では簡単なプログラムで確認して見ます。

test4-1.pl

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

print "「200[.*+?[(){}|¥¥]¥¥¥¥]」にマッチするかどうか¥n¥n";

&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{
  my ($str) = @_;

  if ($str =~ /200[.*+?[(){}|¥]¥¥]/){
    print "○:$str¥n";
  }else{
    print "×:$str¥n";
  }
}

上記を「test4-1.pl」の名前で保存します(文字コードはUTF-8です)。そしてコマンドプロンプトを起動し、プログラムを保存したディレクトリに移動してから次のように実行して下さい。

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

( Written by Tatsuo Ikura )