クイックスタート
チュートリアル
ツール&言語
リファレンス
書籍レビュー
正規表現チュートリアル
はじめに
目次
特殊文字
非表示文字
正規表現エンジンの内部
文字クラス
文字クラスの減算
文字クラスの交差
省略文字クラス
ドット
アンカー
単語境界
選択
オプション項目
繰り返し
グループ化とキャプチャ
後方参照
後方参照、その2
名前付きグループ
相対後方参照
ブランチリセットグループ
フリースペーシングとコメント
Unicode
モード修飾子
アトミックグループ化
所有格量指定子
先読みと後読み
先読みと後読み、その2
マッチからテキストを除外
条件
バランスグループ
再帰
サブルーチン
無限再帰
再帰と量指定子
再帰とキャプチャ
再帰と後方参照
再帰とバックトラック
POSIXブラケット式
ゼロ長の照合
継続的なマッチング
このサイトのその他の情報
はじめに
正規表現クイックスタート
正規表現チュートリアル
置換文字列チュートリアル
アプリケーションと言語
正規表現の例
正規表現リファレンス
置換文字列リファレンス
書籍レビュー
印刷可能なPDF
このサイトについて
RSSフィードとブログ
RegexBuddy—Better than a regular expression tutorial!

正規表現エンジンの内部動作の概要

正規表現エンジンの動作を知ることで、より優れた正規表現をより簡単に作成できるようになります。特定の正規表現が最初に期待した動作をしない理由を素早く理解するのに役立ちます。これにより、より複雑な正規表現を作成する必要がある場合、多くの推測や頭を悩ませる必要がなくなります。

このチュートリアルでは、新しい正規表現トークンを紹介した後、正規表現エンジンが実際にそのトークンをどのように処理するかをステップごとに説明します。この内部の解説は、時に冗長に感じられるかもしれません。しかし、正規表現エンジンがどのように動作するかを理解することで、その機能を最大限に活用し、よくある間違いを避けることができます。

正規表現の実装は多く、構文や動作がわずかに異なる場合や大幅に異なる場合がありますが、正規表現エンジンは基本的に2種類しかありません。それはテキスト指向エンジンと正規表現指向エンジンです。最近のほぼすべての正規表現フレーバーは、正規表現指向エンジンに基づいています。これは、遅延量指定子後方参照など、非常に便利な機能が正規表現指向エンジンでしか実装できないためです。

正規表現指向エンジンは、正規表現を順にたどりながら、正規表現内の次のトークンを次の文字に照合しようとします。一致が見つかった場合、エンジンは正規表現と対象文字列を進めます。トークンが一致に失敗すると、エンジンは正規表現内の前の位置と、正規表現内の別のパスを試すことができる対象文字列にバックトラックします。このチュートリアルでは、後でバックトラックについて詳しく説明します。正規表現指向エンジンを使用する最近の正規表現フレーバーには、アトミックグループ化所有格量指定子など、このバックトラックを制御できる多くの機能があります。

テキスト指向エンジンは、対象文字列を順にたどりながら、文字列内の次の文字に進む前に、正規表現のすべての順列を試します。テキスト指向エンジンはバックトラックを決して行いません。したがって、テキスト指向エンジンのマッチングプロセスについて議論することはあまりありません。ほとんどの場合、テキスト指向エンジンは正規表現指向エンジンと同じ一致を見つけます。

このチュートリアルで正規表現エンジンの内部動作について説明する場合、正規表現指向エンジンを想定して議論します。テキスト指向エンジンが異なる一致を見つけた場合にのみ、テキスト指向エンジンについて言及します。そして、それはあなたの正規表現が同じ位置で一致する可能性のある2つの代替案を持つ選択を使用する場合にのみ本当に起こります。

正規表現エンジンは常に最も左側の一致を返す

これは非常に重要な理解点です。正規表現エンジンは、後で「より良い」一致が見つかる可能性がある場合でも、常に最も左側の一致を返します。正規表現を文字列に適用する場合、エンジンは文字列の最初の文字から開始します。最初の文字で正規表現の可能なすべての順列を試します。すべての可能性が試され、失敗することがわかった場合にのみ、エンジンはテキスト内の2番目の文字に進みます。ここでも、まったく同じ順序で正規表現の可能なすべての順列を試します。その結果、正規表現エンジンは最も左側の一致を返します。

適用する場合cat彼は自分の猫のためにナマズを捕獲した。に対して、エンジンは正規表現内の最初のトークンを一致させようとします。cをマッチの最初の文字Hに。これは失敗します。正規表現は単なるリテラル文字のシーケンスで構成されているため、この正規表現の他の可能な順列はありません。したがって、正規表現エンジンはceと一致させようとします。これも失敗し、cをスペースと一致させるのも失敗します。文字列の4番目の文字に到達すると、ccと一致します。次に、エンジンは2番目のトークンaを5番目の文字、aと一致させようとします。これも成功します。しかし、その後、tpとの一致に失敗します。その時点で、エンジンは正規表現が文字列の4番目の文字から開始して一致させることができないことを認識します。したがって、5番目のaから続行します。ここでも、cはここで一致に失敗し、エンジンは続行します。文字列の15番目の文字で、cは再びcと一致します。次に、エンジンは文字15で正規表現の残りの部分を一致させようとし、aatt.

が一致することを発見します。正規表現全体を文字15から開始して一致させることができました。エンジンは一致を報告することを「熱望」しています。したがって、ナマズの最初の3文字を有効な一致として報告します。エンジンは、この時点を超えて「より良い」一致があるかどうかを確認することはありません。最初の一致は十分であると見なされます。

エンジンの内部動作のこの最初の例では、正規表現エンジンは通常のテキスト検索ルーチンのように動作するだけに見えます。ただし、エンジンが頭の中で実行するステップに従えることが重要です。次の例では、エンジンの動作が検出する一致に大きな影響を与えます。結果の中には驚くべきものがあるかもしれません。しかし、エンジンの動作を理解すれば、それらは常に論理的かつ既定のものとなります。