正規表現の範囲は?
今までは条件に合うかどうかだけをを考えてきました。しかし、正規表現は、長いテキストから、条件に合う部分を抜き出すということもできます。その時に悩むのが、範囲指定です。
例えば
【東京は晴れです。京都は雨です。】というテキストあるとして、【東京から始まって「。」で終わる一文】を探す場合、【東京*。】とすると、マッチはしますが、内容は【東京は晴れです。京都は雨です。】と最後の「。」まで広く検索します。
この検索は、最長検索と呼ばれています。つまり、条件に合う一番広い範囲を優先するということです。正規表現では、マッチする、しないだけではなく、その文字を抜き出す、検索するといった作業を伴う場合も多いので、こでは困ります。例えば「”」で囲まれた部分とか、【】で囲まれた部分をチェックしたい場合、長い文章にそれがいくつも存在すれば、最初に出てくる部分から、一番最後の部分を取り込むことになってしま、うまくいきません。そこで、メタキャラクタ【?】を使います。【?】は、0文字もしくは1文字という意味なのですが、【+?】or【*?】のように使うと、検索を最短にします。といっても解りにくいですね。
最初の例の場合、【東京*。*?】などとします。すると、東京から始まって、任意の文字列【*】があって、【。】があって、任意の0文字もしくは1文字(*?)文字列があるとなります。言葉がおかしいのですが、【。】一回出てくれば十分なのですから、最長検索をする必要は無いと判断されるようです。結果として、最短検索になります。
このように、テキストから、条件に合う部分を抜き出すのをマッチさせると区別して、キャプチャーすると言う場合もあります。
この記事を書いている現在、正規表現チェッカーでは判断できません。時間を見つけて、正規表現キャプチャーチェッカーも作ろうと思います。