連続した文字の指定方法

広告

文字クラスを使用する場合、マッチさせたい文字を全て列挙します。列挙する文字ばバラバラの場合は一つ一つ記述するしかありませんが、例えば数字の「0から9」や文字の「aからz」などのように連続した文字を指定したい場合があります。このような場合にはメタ文字のハイフン(-)を使い範囲指定の形式で記述できます。

例として「0から9」までの文字を文字クラスの中で指定する場合には次のように記述できます。

/[0-9]/

ブラケット([])の中でハイフン(-)を使用した場合だけハイフンはメタ文字としての意味を持ち、ハイフンの左側から右側までの連続した文字を記述した場合と同じです。よって上記は次のように記述した場合と同じです。

/[0123456789]/

アルファベットの「aからz」までを全て文字クラスの中で指定する場合は次のどちらの記述方法でも同じ結果となります。

/[a-z]/
/[abcdefghijklmnopqrstuvwxyz]/

同様にアルファベットの「AからZ」までを全て文字クラスの中で指定する場合は次のどちらの記述方法でも同じ結果となります。

/[A-Z]/
/[ABCDEFGHIJKLMNOPQRSTUVWXYZ]/

今回は「0から9」や「aからz」などの先頭から最後までの場合で確認しましたが、「3から7」とか「dからm」などのような場合でも同じ記述方法で指定できます。(例えば/[3-7]/など)。

また範囲での指定に加えて他の文字を追加して指定することも可能です。

/[c-gxyz]/

上記の場合は「cからg」までの全ての文字と「x」「y」「z」の3つの文字のいずれか一つにマッチします。

範囲の複数指定

範囲は複数記述することが出来ます。例として「0から9」「aからz」「AからZ」を全て指定するには次のように記述します。

/[0-9a-zA-Z]/

範囲を記述する順番も関係ありませんので、[A-Z0-9a-z]のように記述しても同じです。

サンプルプログラム

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

test2-1.pl

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

print "「200[0-9xX]」にマッチするかどうか¥n¥n";

&check("200");
&check("2001");
&check("2005");
&check("2010");
&check("200x");
&check("200X");
&check("200z");

sub check{
  my ($str) = @_;

  if ($str =~ /200[0-9xX]/){
    print "○:$str¥n";
  }else{
    print "×:$str¥n";
  }
}

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

連続した文字の指定方法

( Written by Tatsuo Ikura )