選択肢全体を繰り返す

広告

メタ文字の「*」や「+」は選択肢全体に対しても適用することができます。よって、選択肢のいずれかが繰り返し現れる正規表現を定義することが可能です。(繰り返しに関しては「任意の文字と繰り返し(量指定子)」を参照して下さい)。

具体的な例で考えてみます。

/code (00|11)XX/

上記の場合は「code 00XX」と「code 11XX」の2つの文字列のいずれかに一致する場合にマッチします。これに1回以上繰り返しが行われる場合にマッチするメタ文字「+」を付け加えてみます。

/code (00|11)+XX/

今度の場合、選択肢「(00|11)」に対してメタ文字の「+」が有効となりますので、「00」又は「11」のいずれかの文字列が1回以上繰り返されている場合にマッチすることになります。

例えば次のような文字列がマッチします。

code 00XX
code 11XX
code 0011XX
code 11001111XX

このように選択肢と繰り返しを組み合わせることで、同じ選択肢が繰り返されるだけではなく、複数の選択肢のどれかが繰り返し現れる場合にマッチする正規表現を記述することが出来ます。

サンプルプログラム

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

test2-1.pl

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

print "「no(0|1|2)+ is」にマッチするかどうか¥n¥n";

&check("no0 is xxx");
&check("no2 is yyy");
&check("no11 is zzz");
&check("no021 is xxx");
&check("no03 is yyy");
&check("nois zzz");

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

  if ($str =~ /no(0|1|2)+ is/){
    print "○:$str¥n";
  }else{
    print "×:$str¥n";
  }
}

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

選択肢全体を繰り返す

( Written by Tatsuo Ikura )