最短一致と最長一致

正規表現のマッチング方法の解説

最短一致と最長一致の違いと利用方法について学びましょう。

正規表現の一致の仕組み

正規表現は、文字列そのものではなく、パターンに対応するものなので、 対応の仕方は一通りとは限りません。 例えば、<.*> は、HTMLタグに対応します。 しかし、この正規表現は、例えば、 「<h1>正規表現</h1>」という文字列があったとき、 もちろん、「<h1>」の部分にもマッチします。 しかし、それだけでなく、全体(<h1>正規表現</h1>)にマッチします。 先頭の < と、最後の > にマッチするからです。

このように、正規表現は複数のマッチングが可能な場合があります。 そのため、どのようなマッチングを優先するか、が決められています。

最長一致が標準

正規表現のマッチング方法には、 最短一致(なるべく短く対応する)と最長一致(なるべく長く対応する)があるのですが、 標準では最長一致が適用されます。上の例を用いると、 <.*> は 対応する部分が最も長くなるようにマッチするので、 <h1>正規表現</h1>にマッチします。

最短一致を利用するには

標準では最長一致が適用されるので、最短一致をしたい場合には、 明示的に指示する必要が有ります。

PHPでは、最短一致をしたい場合には、マッチング部分の最後に 「?」を追加しておきます。 例えば、<.*?> のように記述します。 くり返し記号とセットで、「*?」は「0回以上のくり返し(最短一致)」 「*」は「0回以上のくり返し(最長一致)」などと覚えてしまうのもよいでしょう。

なお、最短一致を利用しなくても、同等の結果を得ることができます。 上の例と同じ結果を得るには、<[^>]*> のように記述します。 [^>]* の部分は「>」を含まない文字列になるので、 必ずHTMLタグ一個を抽出することができます。

Copyright (C) 2003-2018. PHP で WEB 作成 All rights reserved.