量を指定するメタ文字3
最長マッチと最短マッチ
正規表現は便利な機能ですが、独特な特徴もあり、注意しないと思っていたものと異なる結果が帰ってくることになります。
普通に正規表現を使うと、正規表現のエンジンは「最長マッチ」を行います。これは、「欲張りなマッチ」とか「目一杯のマッチ」とも言われます。下のような例を考えてみましょう。
<tr><td>boom</td></tr> |
---|
この文章で、HTMLタグのみを取り出したいと考え、次のような正規表現を試しました。
<.+> |
---|
これでうまくタグを取り出せるでしょうか?「<と>に囲まれた、何らかの文字が1つ以上ある」という意味ですので成功のようですが、実はうまくいきません。なぜなら、正規表現の特徴である、最長マッチが行われるからです。
正規表現は”欲張りなマッチング”を行うので、.+つまり何らかの文字をできるだけ多くマッチさせようとします。上の例では<tr>の>で止まらず一番最後のタグ</tr>の>まで拾い上げてしまい、結果は
<tr><td>boom</td></tr> |
---|
がマッチされたと返してしまいます。この問題は、量指定全般にいえることで、 <.*> や<.+>など、何でもかんでもマッチさせようとすると、予期せぬ結果が帰ってくることがあります。
このように、最長マッチでうまくいかないときは「最短マッチ」を使いましょう。これは「控えめなマッチ」とも言われます。最長マッチとちがい、文字をできるだけ少なくマッチさせる機能があります。
やり方は、量指定の後に?をつけるだけです。
<.+?> |
---|
こうすると、正規表現は.+をできるだけ少なく見積もろうとします。そのため<tr>のtrのあとにある>を見つけた時点で検索を終了してくれます。
<tr> |
<td> |
</td> |
</tr> |
このような結果が帰ってきて、マッチは成功します。