文字クラスに列挙した文字以外とマッチする

文字クラスではブラケットの中に記述したいずれかの文字と一致する場合にマッチしますが、メタ文字の「^」をブラケットの中に記述することで列挙した文字以外のいずれかの文字と一致する場合にマッチします。ここでは Perl の正規表現でメタ文字「^」を使って文字クラスの中に列挙した文字以外に文字にマッチさせる方法について解説します。

(Last modified: )

文字クラスの否定

文字クラスではマッチする候補の文字を列挙しますが、先頭にメタ文字の ^ を記述すると、逆に列挙した文字以外のいずれかの文字と一致するとマッチするようにできます。

例えば "A", "G", "P" のいずれか一つとマッチするパターンは文字クラスを使うと次のように記述できます。

/[AGP]/

先ほどとは逆に "A", "G", "P" 以外の文字とマッチするパターンを記述する場合は、ブラケットの先頭にメタ文字の ^ を記述します。

/[^AGP]/

このように文字クラスのブラケット( [] )の中で、 [ の直後に ^ が記述された場合、それ以降に列挙された文字を否定する役割を持ちます。

なお ^[ の直後に記述された場合だけ特別な意味を持ちます。それ以外の位置に記述された場合は単なる "^" と言う文字となります。

/[0-9^ab]/

上記の場合は "0" から "9"、 "^" 、 "a" 、 "b" のいずれかにマッチする文字クラスとなります。

なおメタ文字の ^ はパターンの先頭に記述されると文字列の先頭にマッチするメタ文字としても使用されます。詳しくは「メタ文字「^」:文字列の先頭とマッチする」を参照されてください。

サンプルコード

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

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

&check("2000");
&check("2003");
&check("2006");
&check("2007");
&check("2008");
&check("2010");

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

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

perl sample.pl

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

文字クラスに列挙した文字以外とマッチする(1)

文字クラスでブラケットの中にメタ文字の ^ を記述して、列挙した文字以外の文字にマッチするパターンを作成し、複数の文字列とマッチするか確認して結果を画面に表示しました。

-- --

Perl の正規表現でメタ文字「^」を使って文字クラスの中に列挙した文字以外に文字にマッチさせる方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

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