NAME

perlrequick - Perl 正規表現のクイックスタート

DESCRIPTION

このページは、Perl の正規表現 ('regexes') の理解、作成、使用の基本中の 基本に対応しています。

ガイド

単純な単語のマッチング

最も単純な正規表現は単なる単語、より一般的には文字の並びです。 正規表現は単語を構成する任意の文字列にマッチングする単語からなります:

    "Hello World" =~ /World/;  # matches

この文で、World は正規表現であり、 // で囲まれた /World/ は Perl に対してマッチングのために文字列を検索することを指示します。 =~ という演算子は正規表現にマッチングする文字列に結び付けられ、 正規表現がマッチングすれば真の値を生成し、マッチングしなければ偽となります。 この例では、World"Hello World" の二番目の単語にマッチングするので、 式は真となります。 この考え方にはいくつかのバリエーションがあります。

以下のような式は条件文で便利です:

    print "It matches\n" if "Hello World" =~ /World/;

マッチングの成否の意味を反転する演算子 !~ があります:

    print "It doesn't match\n" if "Hello World" !~ /World/;

正規表現中のリテラル文字列は変数に置き換えることもができます:

    $greeting = "World";
    print "It matches\n" if "Hello World" =~ /$greeting/;

$_ に対してマッチングを行う場合、$_ =~ の部分は省略できます:

    $_ = "Hello World";
    print "It matches\n" if /World/;

最後に、マッチングのための // のデフォルトデリミタは 'm' を 前置することにより任意のものにすることができます:

    "Hello World" =~ m!World!;   # マッチングする。デリミタは '!'
    "Hello World" =~ m{World};   # マッチングする。組になっている '{}' に注意
    "/usr/bin/perl" =~ m"/perl"; # 'usr/bin' の後にマッチングする
                                 # '/' は普通の文字になっている

正規表現は、文が真となるためには 正確に 順序通りに文字列の 一部としてマッチングしなければなりません。

    "Hello World" =~ /world/;  # マッチングしない; 大文字小文字は区別する
    "Hello World" =~ /o W/;    # マッチングする; ' ' は普通の文字
    "Hello World" =~ /World /; # マッチングしない; 末尾に ' ' はない

Perl は常に文字列の中で最初に現れるものをマッチングしようとします:

    "Hello World" =~ /o/;       # 'Hello' の 'o' にマッチング
    "That hat is red" =~ /hat/; # 'That' の中の 'hat' にマッチング

すべての文字がマッチングにおいて'あるがまま'(as is) に使われるのでは ありません。 メタ文字 と呼ばれる幾つかの文字が正規表現の記述に使うために 予約されています。 メタ文字には以下のものがあります

    {}[]()^$.|*+?\

メタ文字はバックスラッシュを前置することによってマッチングさせられます:

    "2+2=4" =~ /2+2/;    # マッチングしない。+ はメタ文字
    "2+2=4" =~ /2\+2/;   # マッチングする。\+ 普通の + のように扱われる
    'C:\WIN32' =~ /C:\\WIN/;                       # マッチングする
    "/usr/bin/perl" =~ /\/usr\/bin\/perl/;  # マッチングする

最後の正規表現では、スラッシュ '/' もまたバックスラッシュが つけられています; なぜなら、それが正規表現のデリミタとして使われているからです。

印字できない ASCII 文字は エスケープシーケンス によって表現されます。 一般的な例では、タブを表す \t、改行を表す \n、復帰を表す \r が あります。 任意のバイトは 8 進エスケープシーケンス (例えば \033) あるいは 16 進エスケープシーケンス (例えば \x1B) で表現できます:

    "1000\t2000" =~ m(0\t2)      # マッチングする
    "cat"      =~ /\143\x61\x74/ # ASCII でマッチングするが、cat を綴る変な方法

正規表現はほとんどの場合においてダブルクォートで囲まれた文字列のように 扱われるので、変数置換は動作します:

    $foo = 'house';
    'cathouse' =~ /cat$foo/;   # マッチングする
    'housecat' =~ /${foo}cat/; # マッチングする

これまでの正規表現では、文字列のどこかでマッチングすればマッチングしたと みなしてきました。 文字列の どこで 正規表現がマッチングするのかを指定するには、 アンカー メタ文字である ^$ を使います。 アンカー ^ は文字列の先頭でマッチングすることを意味し、アンカー $ は 文字列の末尾(あるいは文字列の末尾にある改行の前) でマッチングすることを 意味します。 いくつか例を挙げます:

    "housekeeper" =~ /keeper/;         # マッチングする
    "housekeeper" =~ /^keeper/;        # マッチングしない
    "housekeeper" =~ /keeper$/;        # マッチングする
    "housekeeper\n" =~ /keeper$/;      # マッチングする
    "housekeeper" =~ /^housekeeper$/;  # マッチングする

文字クラスを使う

文字クラス は正規表現の特定の場所においてマッチングする可能性のある文字の 集合です(単一の文字ではありません)。 文字クラスはブラケット [...] で表現され、マッチングする可能性のある文字の 集合はその内側に置かれます。 以下はその例です:

    /cat/;            # 'cat' にマッチングする
    /[bcr]at/;        # 'bat', 'cat', 'rat' のいずれかにマッチングする
    "abc" =~ /[cab]/; # 'a' にマッチングする

最後の文において、'c' がクラスの最初の文字であるにもかかわらず 正規表現がマッチングすることのできる最初の位置にある文字である 'a' が マッチングします。

    /[yY][eE][sS]/; # 大文字小文字を無視して 'yes' にマッチングする
                    # 'yes', 'Yes', 'YES' など。
    /yes/i;         # これも大文字小文字を無視して 'yes' にマッチングする

最後の例は大文字小文字を無視してマッチングするようにする 'i' 修飾子 (modifier) を使ったマッチングを示しています。

文字クラスも普通の文字と特殊文字がありますが、文字クラスの内側での 普通の文字と特殊文字は、文字クラスの外側の物とは違います。 文字クラスのために特殊な文字は -]\^$ で、エスケープを使って マッチングされます:

   /[\]c]def/; # ']def' または 'cdef' にマッチング
   $x = 'bcr';
   /[$x]at/;   # 'bat', 'cat', 'rat' にマッチング
   /[\$x]at/;  # '$at' または 'xat' にマッチング
   /[\\$x]at/; # '\at', 'bat, 'cat', 'rat' にマッチング

特殊文字 '-' は文字クラスの中で範囲演算子として振舞うので、 [0123456789][abc...xyz] のような 見づらいものはすっきりとした [0-9] であるとか [a-z] のように 書き換えられます:

    /item[0-9]/;  # 'item0' ... 'item9' にマッチングする
    /[0-9a-fA-F]/;  # 16 進数にマッチングする

'-' が文字クラスの中の最初か最後の文字であった場合、通常の文字として 扱われます。

文字クラスの先頭の位置にある特殊文字 ^反転文字クラス を表し、 ブラケットの中にない文字にマッチングします。 [...][^...] の両方とも、一つの文字にマッチングせねばならず、 そうでない場合にはマッチングは失敗します。 ですから

    /[^a]at/;  # 'aat' や 'at' にはマッチングしないが、その他の
               # 'bat', 'cat, '0at', '%at' などにはマッチングする
    /[^0-9]/;  # 数字以外にマッチングする
    /[a^]at/;  # 'aat' か '^at'にマッチングする。ここでは '^' は通常の文字

Perl は一般的な文字クラスの略記法を持っています。 (これらの定義は Perl が /a 修飾子によって ASCII モードを 使っているときのものです。 詳しくは "Backslash sequences" in perlrecharclass を参照してください。)

\d\s\w\D\S\W の省略記法は文字クラスの内側でも外側でも使うことができます。 以下はその例です:

    /\d\d:\d\d:\d\d/; # hh:mm:ss 形式の時間表記にマッチング
    /[\d\s]/;         # 数字または空白にマッチング
    /\w\W\w/;         # 非単語文字が続きさらに単語文字が続く
                      # 単語文字にマッチング
    /..rt/;           # 'rt' が続く任意の二文字にマッチング
    /end\./;          # 'end.' にマッチング
    /end[.]/;         # 同じこと。'end.' にマッチング

語アンカー (word anchor) \b はこれは単語を構成する文字と単語を 構成しない文字の間 \w\W\W\w の境界にマッチングします:

    $x = "Housecat catenates house and cat";
    $x =~ /cat/;    # 'housecat' の cat にマッチング
    $x =~ /\bcat/;  # 'catenates' の cat にマッチング
    $x =~ /cat\b/;  # 'housecat' の cat にマッチング
    $x =~ /\bcat\b/;  # 文字列の終端の'cat'にマッチング

最後の例では、文字列の終端は単語境界として認識されています。

あれやこれやにマッチングする

異なる文字列を 選択 メタ文字 '|' によって行えます。 dog または cat にマッチングさせるには、正規表現を dog|cat のようにします。 以前述べた通り、Perlは文字列の可能な限り最も早い位置でマッチングを 行おうとします。 それぞれの文字位置で、Perlはまずはじめに最初の選択である dog に マッチングさせることを試みます。 もし dog がマッチングしなければ、Perl は次の選択肢である cat を 試します。 cat もまたマッチングしなければ、マッチングは失敗してPerlは文字列の 次の位置に移動します。 幾つか例を挙げましょう:

    "cats and dogs" =~ /cat|dog|bird/;  # "cat" にマッチング
    "cats and dogs" =~ /dog|cat|bird/;  # "cat" にマッチング

二番目の正規表現において最初の選択肢が dog であるにもかかわらず、 cat が文字列で最初に現れるマッチング対象です。

    "cats"          =~ /c|ca|cat|cats/; # "c" にマッチング
    "cats"          =~ /cats|cat|ca|c/; # "cats" にマッチング

与えられた文字位置で、正規表現のマッチングを成功させるための 最初の選択肢はマッチングする一つとなります。 ここでは、全ての選択はは最初の文字列位置でマッチングするので、 最初のものがマッチングします。

グループ化と階層的マッチング

グループ化 メタ文字 () は正規表現の一部分を一つのユニットとして 扱うことを許します。 ある正規表現の一部はカッコによって囲まれることでグループ化されます。 正規表現 house(cat|keeper) は、catkeeper が後続する house にマッチングすることを意味します。 幾つか例を挙げましょう

    /(a|b)b/;    # 'ab' または 'bb' にマッチング
    /(^a|b)c/;   # 文字列の先頭にある 'ac' か任意の場所の'bc'にマッチング

    /house(cat|)/;  # 'housecat' か 'house' にマッチング
    /house(cat(s|)|)/;  # 'housecats' か 'housecat' か 'house' のいずれかに
                        # マッチング。グループがネストできることに注意

    "20" =~ /(19|20|)\d\d/;  # 空の選択肢 '()\d\d' にマッチング
                             # '20\d\d' はマッチングできないから

マッチングしたものを取り出す

グループ化メタ文字 () はまた、まったく異なる別の機能を有しています: マッチングした文字列の一部分を展開することができるのです・これは一般的に、 マッチングしたものを見つけ出したり、テキスト処理のために非常に 便利なものです。 それぞれのグループ化に対して、マッチングした部分が特殊変数 $1, $2 などに 格納されます。 これらの変数は通常の変数と同じように使うことができます:

    # 時、分、秒を抽出する
    $time =~ /(\d\d):(\d\d):(\d\d)/;  # hh:mm:ss 形式にマッチングする
    $hours = $1;
    $minutes = $2;
    $seconds = $3;

リストコンテキストでは、グループ化付きのマッチング /regex/ は マッチングした値のリスト ($1,$2,...) を返します。 従ってこれは以下のように書き換えられます

    ($hours, $minutes, $second) = ($time =~ /(\d\d):(\d\d):(\d\d)/);

正規表現中のグループ化がネストしていた場合、$1 は最も左にある 開きかっこによってグループ化されているものを取り、$2 は 次の開きかっこによるものを取り…となっていきます。 例えば、以下は複雑な正規表現と、後述するマッチング変数です:

    /(ab(cd|ef)((gi)|j))/;
     1  2      34

マッチング変数 $1, $2 …に密接に結び付けられたものは、 後方参照 (backreferences) \g1, \g2 …です。 後方参照は正規表現の 内側 で使うことのできるマッチング変数です:

    /(\w\w\w)\s\g1/; # 文字列中の 'the the' のような並びを探す

$1, $2 …は正規表現の外側のみで用い、 後方参照 \1, \2 …は正規表現の内側でのみ使うようにすべきです。

マッチングの繰り返し

量指定子 (quatifier) ?, *, +, {} によって、 マッチングさせたいと考えている正規表現の一部分の繰り返し回数を 指定できます。 量指定子は繰り返しを指定したい文字、文字クラス、またはグループの直後に 置きます。 量指定子には以下のような意味があります:

以下に幾つか例を挙げます:

    /[a-z]+\s+\d*/;  # 小文字の単語、幾つかの空白、それに続く任意の長さの
                     # 数字にマッチング
    /(\w+)\s+\1/;    # 任意の長さの単語の重複にマッチング
    $year =~ /\d{2,4}/;  # 年が少なくとも 2 桁あるが最大でも 4 桁に
                         # なるようにする
    $year =~ /\d{4}|\d{2}/;    # もっと良い。3桁をはじく

これらの量指定子はは正規表現のマッチングが成功するのを許す範囲で 可能な限りの文字列をマッチングさせようとします。 従って、以下のようになります

    $x = 'the cat in the hat';
    $x =~ /^(.*)(at)(.*)$/; # マッチングする
                            # $1 = 'the cat in the h'
                            # $2 = 'at'
                            # $3 = ''   (0 回マッチング)

最初の量指定子 .* は正規表現がマッチングする範囲で可能な限りの 長い文字列をつかみとります。 2 番目の量指定子は .* には文字列が残されていないので、0 回 マッチングします。

More matching

マッチング演算子について知りたいかもしれないことがあといくつかあります。 グローバル修飾子 //g は一つの文字列に出来るだけ何回もマッチングすることを 許します。 スカラコンテキストでは、文字列に対するマッチングの成功によって //g はマッチングからマッチングにジャンプし、文字列の位置を記録し続けて いきます。 pos() 関数を使って位置を取得または設定できます。 例えば:

    $x = "cat dog house"; # 3 words
    while ($x =~ /(\w+)/g) {
        print "Word is $1, ends at position ", pos $x, "\n";
    }

は以下を表示します

    Word is cat, ends at position 3
    Word is dog, ends at position 7
    Word is house, ends at position 13

マッチングに失敗したり、ターゲット文字列を変更するとこの位置は リセットされます。 もしマッチングに失敗したときに位置をリセットしたくないのであれば、 /regexp/gc のように //c を追加します。

リストコンテキストでは、//g はマッチングしたグループのリストを返します。 グループ化の指定がなければ、正規表現全体にマッチングするリストを返します。 従って

    @words = ($x =~ /(\w+)/g);  # マッチングする
                                # $word[0] = 'cat'
                                # $word[1] = 'dog'
                                # $word[2] = 'house'

検索と置換

検索と置換は s/regexp/replacement/modifiers を使って処理されます。 replacement は Perlでのダブルクォートで囲まれた文字列で、 regexp にマッチングした文字列を置き換えるものです。 =~ 演算子もまた s/// を伴った文字列に結びつけられるために 使われます。 $_ に対してマッチングを行う場合には、$_ =~ は省略できます。 マッチングに成功した場合には s/// は置換が行われた数を返します; 失敗した場合には偽を返します。 幾つか例を挙げましょう:

    $x = "Time to feed the cat!";
    $x =~ s/cat/hacker/;   # $x の内容は "Time to feed the hacker!"
    $y = "'quoted words'";
    $y =~ s/^'(.*)'$/$1/;  # シングルクォートを剥ぎ取る
                           # $y の内容は "quoted words"

s/// 演算子を使うにあたって、$1, $2 といったマッチング変数は その置換式のなかで即座に使うことができます。 グローバル修飾子 s///g を使うことで、文字列中のすべての正規表現に マッチングする検索と置換を行います:

    $x = "I batted 4 for 4";
    $x =~ s/4/four/;   # $x の内容は "I batted four for 4"
    $x = "I batted 4 for 4";
    $x =~ s/4/four/g;  # $x の内容は "I batted four for four"

非破壊修飾子 s///r$_ (または =~ によって置換されることになる 変数) を変更する代わりに、置換の結果を返します:

    $x = "I like dogs.";
    $y = $x =~ s/dogs/cats/r;
    print "$x $y\n"; # prints "I like dogs. I like cats."

    $x = "Cats are great.";
    print $x =~ s/Cats/Dogs/r =~ s/Dogs/Frogs/r =~ s/Frogs/Hedgehogs/r, "\n";
    # prints "Hedgehogs are great."

    @foo = map { s/[a-z]/X/r } qw(a b c 1 2 3);
    # @foo is now qw(X X X 1 2 3)

評価修飾子 s///e は置換文字列を eval{...} でラップし、その評価結果を マッチングした部分文字列の置換のために使います。 いくつか例を挙げます:

    # 文字列中の全ての単語を逆順にする
    $x = "the cat in the hat";
    $x =~ s/(\w+)/reverse $1/ge;   # $x は "eht tac ni eht tah"

    # 百分率を 10 進数に置き換える
    $x = "A 39% hit rate";
    $x =~ s!(\d+)%!$1/100!e;       # $x は "A 0.39 hit rate"

最後の例のように、s///s!!!s{}{} 、 果ては s{}// のように異なるデリミタを使うことができます。 s''' のようにシングルクォートが使われた場合、その正規表現と 置換テキストはシングルクォート文字列のように扱われ、変数の置き換えは 行われません。

split 演算子

split /regex/, string, limitstring オペランドを部分文字列の リストに分割し、そのリストを返します。 regex は、string を分割するときに使われる文字並びを決定します。 たとえば、文字列を単語に分割するには以下のようにします

    $x = "Calvin and Hobbes";
    @word = split /\s+/, $x;  # $word[0] = 'Calvin'
                              # $word[1] = 'and'
                              # $word[2] = 'Hobbes'

カンマ区切りの数値リストを展開するには、以下のようにします

    $x = "1.618,2.718,   3.142";
    @const = split /,\s*/, $x;  # $const[0] = '1.618'
                                # $const[1] = '2.718'
                                # $const[2] = '3.142'

// が使われた場合には、文字列は個々の文字に分割されます。 正規表現がグループ化を伴っていた場合には、グループ化されたものも部分文字列に 含まれるようになります:

    $x = "/usr/bin";
    @parts = split m!(/)!, $x;  # $parts[0] = ''
                                # $parts[1] = '/'
                                # $parts[2] = 'usr'
                                # $parts[3] = '/'
                                # $parts[4] = 'bin'

$x の最初の文字に正規表現がマッチングしているので、split はリストの 最初の要素に空要素を置きます。

BUGS

なし。

SEE ALSO

これは単なるクイックスタートガイドです。 正規表現に関するより深いチュートリアルについては perlretut を、 リファレンスについては perlre を参照してください。

AUTHOR AND COPYRIGHT

Copyright (c) 2000 Mark Kvale All rights reserved.

This document may be distributed under the same terms as Perl itself.

Acknowledgments

The author would like to thank Mark-Jason Dominus, Tom Christiansen, Ilya Zakharevich, Brad Hughes, and Mike Giroux for all their helpful comments.