"Regular Expression" #7
Riue ちゃんの正規表現講座 / 其七
今回からは、いよいよ Perl の正規表現について解説していきます。 まずはこれまでのおさらいと、Perl の世界におけるルールについて説明しましょう。
世間では Perl が大人気
最近は限定正規表現や拡張正規表現が使えるツール、つまり sed や awk なんかよりも、Perl のほうが使われる機会のほうが多いみたいですね。 私自身は Perl よりも sed や awk を嗜む人間なので、最近の 「Perl バンザイ」という風潮はちょっと辛いものがあったりします。
とは言え、最近では猫も杓子も Perl を覚えようって必死になってますですし、 英会話の NOVA でも Perl ネイティブの人間を雇って「良質の Perl シャワー」で Perl を教え込んだりしてますし、津田英語会では Perl の講座に女子大生が殺到、 なんていう事態が起きているそうです。やは今後、Perl を知らない人というのはグローバルスタンダードの波にも乗れず、コギャルに「なにコイツゥー、チョーダサってカンジー」 なんて言われてしまい、あまつさえ「うちの主人ってば、まだ Perl も使えなくって…」などと奥さんに陰口叩かれたり… などといった事態を招いてしまうかもしれません(あからさまに嘘です)。
「それじゃ、今まで awk や sed なんかで使われている正規表現を覚えてたのは全然ムダだったのか?」 などと思う方もおられるかもしれませんが…でも、やはり基本として限定正規表現や拡張正規表現を押さえておいたほうがよいわけです。Perl の膨大な正規表現を最初から覚えるのは、ちょっと辛いですからね。
それでは、長らくお待たせしました。いよいよ Perl で使われる正規表現の説明を始めます。
でも最初はおさらいから
さて、ここまでの間にすっかり正規表現のことを忘れてしまわれた方がおられるかもしれません。 というわけで、基本的な事実をおさらいしましょう。
-
普通の文字は、その文字自身にマッチする。例えば「
a」という文字は、 「a」という文字にマッチする。 -
普通の文字列は、その文字列自身にマッチする。例えば「
abc」という文字列は、 「abc」という文字列にマッチする。 -
自分自身にマッチしない文字のことを「メタキャラクタ」と言う。例えば、「\」は「\」という文字にはマッチしない。
「
\」は「次の文字をクォートする」という意味のメタキャラクタである。 - メタキャラクタを普通の文字として扱うには、その直前に「
\」を置く。 例えば、「\」を「\」にマッチさせるには、「\\」と書けばよい。
Perl のルール
さて、Perl では上記のルールに新しいルールが加わります。それは、
普通の文字の直前に「\」がつくと、その文字がメタキャラクタになってしまうコトがある。
というものです。
このルールの適用を受ける文字を、ちょっと表にしてみました。
| メタキャラクタ | 意味 |
|---|---|
\a | ベル |
\A | 文字列の先頭 |
\b | 単語の境界 |
\B | 単語の境界以外 |
\d | 数字(0-9) |
\D | 数字(0-9)以外 |
\e | エスケープ文字(ESC) |
\f | 改ページ文字(FF) |
\G | 前回の m//g が起こった場所 |
\n | 改行文字(LF) |
\s | 空白文字…つまり、タブ、スペース、改行、改ページ |
\S | 空白文字以外 |
\t | タブ文字(TAB) |
\w | 英数字 |
\W | 英数字以外 |
これらは、「\」と次の
1 文字で初めて「1 文字」として認識されます。
例えば、「\d」という文字は
「0、1、2、3、4、5、6、7、8、9 のどれかの文字にマッチする」という具合です。
さて、この表を見て気分が悪くなってしまった貴方(貴女)、大丈夫です。
別に今すぐこの表を全部覚えろ、というわけではありません。
ここでは「『\』と『普通の文字』の組み合わせでメタキャラクタが生まれることがある」
ということだけ覚えて頂ければ結構です(個別の文字の意味は、またおいおい説明していきます)。
量指定子 : 繰り返しの回数
さて、Perl の正規表現で最初にお話するのは、 限定正規表現や拡張正規表現で使っていた「繰り返し回数の定義」です。 当然ながら、この概念は Perl にもちゃんとあります。
そうそう、この手の「繰り返し回数を定義するメタキャラクタ」のことを、「量指定子(quantifier)」 或いは「数量子」と言うことがありますです。ぜひ覚えておいて下さい。
*-
0 回以上の繰り返しにマッチ。「
{0,}」と同じ。 +-
1 回以上の繰り返しにマッチ。「
{1,}」と同じ。 ?-
0 回、または 1 回の繰り返しにマッチ。「
{0,1}」と同じ。 {n}- n 回の繰り返しにマッチ。
{n,}- n 回以上の繰り返しにマッチ。
{n,m}- n 回以上 m 回以下の繰り返しにマッチ。
限定正規表現で使われていた「\{」
「\}」が、Perlでは分かりやすく
「{」「}」
と書けるようになっていることにだけ注意して下さい。
「それでは、『{』や『}』にマッチさせるときは『\{』や、
『\}』って書かなければならないのか?」
と心配される人がいるかもしれませんが、大丈夫です。
実は、「{」「}」
がメタキャラクタとして見做されるのは、「量指定子」として扱われる場合だけなのです。
それ以外では、ちゃんと単なる文字として扱われます。
他のメタキャラクタは、全て今までに説明したものばかりですね。 使い方も今までと変わりません。例えば、
a*は、「空文字列」「a」「aa」「aaa」などにマッチしますし、
1?は「1」か「空文字列」にマッチします。
どこまで繋がるのか?
さて、限定正規表現や拡張正規表現のときは説明しなかったんですが… 量指定子を使った場合、マッチする範囲というのはどうなっているのでしょう。例えば、
PowerMacintosh 9.*0という正規表現は、
PowerMacintosh 9600/300という文脈では、どこまでマッチするのでしょう。
PowerMacintosh 960PowerMacintosh 9600PowerMacintosh 9600/300
答えは 3…つまり、「パターンがマッチする限り、出来る限り多くのモノにマッチする」となっています。 この原則を「最長一致」と言います。
さて、Perl でもこの「最長一致」の原則は貫かれているのですが、Perl
ではそこは融通がきくようになっています。
量指定子の後ろに「?」をつけることによって、「最短一致」…
つまり、「パターンがマッチする範囲で、一番短いモノにマッチする」という方法に変更することが出来るのです。
ここで使っている「?」を、
「0 回か 1 回の繰り返し」に使う「?」と混同しないで下さいね。
もちろん、「?」
(0 回か 1 回の繰り返し)に続けて「?」
(「最短一致」で判断する)を指定することは出来ますけど…
そもそも「?」(0 回か 1 回の繰り返し)に「最長一致」という概念は存在しないので、
あまり意味はありません。
「?」(「最短一致」で判断する)を使うと、
先の「PowerMacintosh 9.*0」
に「?」をつけた
PowerMacintosh 9.*?0という正規表現は、「PowerMacintosh 960」にマッチすることになります。
他の例も挙げてみましょう。
a+?
という文字列は、「a」があればマッチします。
「aaaaaaa」なんていう文字列があったとしても、先頭の「a」にだけマッチしておしまいです。
「?」がなければ、「aaaaaaa」全部にマッチしていたのですけどね。
とりあえずのおしまい
今回は「Perl の正規表現」の第 1 回目ということで、 「新しく加わったルール」と「量指定子」という概念について説明しました。 次回からは、いよいよ Perl 独自の正規表現について説明します。 これがまた数は多いわ、一見よくわかんないわで、もう大変な騒ぎなのですが… 使いこなすとこれまた強力なパワーを発揮します。
それでは、次回までさようなら。