正規表現演算子 qr//

正規表現のパターンをコンパイルする

構文

解説

[Perlop の翻訳です]

qr// は、STRING を正規表現としてクォート(可能ならコンパイル)します。 STRINGm/PATTERN/PATTERN と同じように補完されます。 もし "'" が区切り文字に使われたら、一切の変数補完は行われません。 対応の /STRING/msixpodualn 表現の代わりに使うことができる Perl 値を返します。 その戻り値とは元のパターンを正規化したものとなります。 同じ文字を含む文字列とは不思議なことに異なります。 というのも、ref(qr/x/) は "Regexp" を返します。 そのデリファレンスに関してはっきりと定義されていません(今のところ元のパターンが正規化されたものが得られますが、 これは変更されるかもしれません)。

$rex = qr/my.STRING/is;
print $rex;    # (?^si:my.STRING) と出力される
s/$rex/foo/;

上記のコードは、次のコードと同等です。

s/my.STRING/foo/is;

qr// の結果は、サブパターンとして使うこともできます。

$re = qr/$pattern/;
$string =~ /foo${re}bar/;    # パターンの一部としても利用可能
$string =~ $re;              # スタンドアローンでも利用可能
$string =~ /$re/;            # この方法でも利用可能

Perl は qr() 演算子の実行時にそのパターンをコンパイルすることがあります。 そのため、qr() を使うと、とりわけ qr() の結果がスタンドアローンで使われた場合、 状況によっては処理速度が速くなるかもしれません。

    sub match {
        my $patterns = shift;
        my @compiled = map qr/$_/i, @$patterns;
        grep {
            my $success = 0;
            foreach my $pat (@compiled) {
                $success = 1, last if /$pat/;
            }
            $success;
        } @_;
    }

qr() によってパターンを内部表現に事前コンパイルすることで、 /$pat/ が評価されるたびにパターンの再コンパイルの必要性を回避しています。 (Perl は他にも多くの内部最適化を持ち合わせていますが、qr() 演算子を使わなかったら、 前述の例の中ではどの最適化も行われないでしょう。)

qr// に指定できるオプションは下表のとおりです。

オプション 説明
m 文字列を複数行として扱います。
s 文字列を 1 行として扱います。(. を改行に一致させます)
i 大文字と小文字を区別せずにパターンマッチを行います。
x 拡張正規表現を使います:x を 2 つ指定すると、\t と SPACE 文字は角括弧 [] クラスの中では無視されます。
p マッチングの際、マッチした文字列のコピーを保持して ${^PREMATCH}, ${^MATCH}, ${^POSTMATCH} を使えるようにします。 (v5.20 以降は常に使えるようになったため、このオプションは無視されます。)
o パターンのコンパイルを 1 度だけにします。
a ASCII 制限:\d, \s, \w, [[:posix:]] 文字クラスに対して ASCII を使います。 2 つの a を指定すると、/i のもとでは、非 ASCII 文字にはどんな ASCII 文字も一致しない、という制約が追加されます。
l ランタイムのロケールのルールを使います。
u ユニコードのルールを使います。
d 5.12 以前では、ユニコードまたはネイティブの文字セットを使います。
n 非 キャプチャーモードにします。() に一致した文字列を $1$2 にセットしないなど。

事前コンパイルされたパターンがより大きなパターンに組み込まれているなら、"msixpluadn" の効果は適切に伝搬します。 /o 修飾子が持つ効果は伝搬せず、それを明示的に使うことで、その効果はそれらのパターンに制限されます。

/a, /d, /l, /u 修飾子(Perl 5.14 で追加)は、 文字セットのルールを制御しますが、明示的に指定したくなるのは /a だけでしょう。 他の 3 つは様々なプラグマによって自動的に選択されます。

STRING の正当な構文に関するさらなる情報、そして、正規表現のセマンティクスの詳細については perlre をご覧ください。 今ではもう使われなくなった /o を除くすべての修飾子は、 perlre の "Modifiers" で詳しく解説されています。