正規表現どうしの演算

「"foo" で始まって "bar" で終わる」文字列だけに何かしたいときは、for 文かなにかで文字列を順に与えながら、こんな正規表現でマッチかける:

/^foo.*bar$/


「"fo" で始まって "ar" で終わる」文字列をひっかけたいときは、こう:

/^fo.*ar$/


このふたつの正規表現をよく見てみると、最初のやつにマッチするような文字列は、ふたつめのやつにも絶対マッチする。


ある文字列が与えられて、それが、「いくつかの正規表現のうちの少なくとも一つにマッチするもの」に対して何かを行う場合、上の例のように正規表現がダブっていると、無駄に処理を行うことになる。これを減らす方法ってあるんだろうか。(人間が調べればわかるけどさ。)


さらに例:

#! /usr/bin/perl

@arr = qw(
    foobar
    foxcar
    fumeur
);

foreach $_ (@arr) {
    if (/^foo.*bar$/ or /^fo.*ar$/ or /^f.*r$/) {
        print "$_ match\n"
    }
}
foobar match
foxcar match
fumeur match


この Perl の例だと、結局「"f" で始まって "r" で終わる」文字列をマッチさせるなら、それより前に書いてある二つの正規表現にマッチしているかどうかを調べるのは無駄だ。


正規表現が複数与えられたときに、それらの論理和(みたいなもの)を返す手続きって書けるんだろうか。

/(^foo.*bar$)|(^fo.*ar$)|(^f.*r$)/

そりゃまあ、そうだけど。