正規表現で最短一致検索を行う方法

正規表現

繰り返しの正規表現は、そのままの状態で使用すると最長一致検索になります

つまり、その表現であらわすことのできる一番長い文字に一致します。

最長一致の例

本サイトのOpenLayersの記事のソースコードを例に解説します。

このソースコードの中から「シングルコーテーションで囲まれた文字」を検索します。

何も考えずに正規表現を記述すると、下記のようになると思います。

これで検索を行うと下記のようになります。

一見すると、きちんと検索が行われているように見えますが、

606行目、607行目については、シングルコーテーションに囲まれていない箇所についても、検索に引っかかっています。

これが、最長一致検索と呼ばれるもので、繰り返しの正規表現の通常の挙動となります。

最長一致のマッチの仕方

動作は以下のようになっております。(606行目)

  • シングルコーテーションが存在するか、行頭から検索を開始する。
  • シングルコーテーションが見つかる
  • 「.*」(=なんでもいいから0文字以上)に続く、2つ目のシングルコーテーションを探しに行く
  • “color”の後ろのシングルコーテーションが見つかる
  • 後ろにシングルコーテーションがないか、さらに後ろを検索する
  • “white”の前に、シングルコーテーションが見つかる
  • 後ろにシングルコーテーションがないか、さらに後ろを検索する
  • “white”の後ろにシングルコーテーションが見つかる
  • 後ろにシングルコーテーションがないか、さらに後ろを検索する
  • みつからないので、一番最後に見つかったシングルコーテーションまでをマッチさせる

上記のように、「.*」という表現は、可能な限り長い文字をマッチさせに行こうとします

最短一致検索

しかし、これでは、「シングルコーテーションに囲まれた文字だけを検索したい」ということができません。

そこで、最短一致検索を行うようにするために、正規表現を修正します。

先ほどの正規表現に「?」を追加しただけです。

これで検索するとこのようになります。

シングルコーテーションで囲まれた文字のみが検索に引っかかるようになります。

最短一致検索のマッチの仕方

最短一致検索は以下のようにマッチします。(606行目)

  • シングルコーテーションが存在するか、行頭から検索を開始する。
  • シングルコーテーションが見つかる
  • 「.*」(=なんでもいいから0文字以上)に続く、2つ目のシングルコーテーションを探しに行く
  • “color”の後ろのシングルコーテーションが見つかる
  • 2つめのシングルコーテーションが見つかった時点で、即時に検索を終了する

繰り返し記号の「*」の後ろに「?」を付けることで、上記のような最短一致の挙動になります。

今回は、なんでもいいから0文字以上を表す「*」の直後につけて、最短一致検索を解説しましたが、
「{}」「+」など、他の繰り返しの正規表現でも、後ろに「?」を付けることで、最短一致検索になります。

まとめ

今回は最短一致検索についてお伝えしました。

繰り返しを表す正規表現の後ろに「?」を付けることで、最短一致検索になります。

最長一致ではできない検索を、最短一致ではできるようになります。

みなさんも色々と遊んでみてください。

正規表現についての別記事についてもご覧ください!

★検索
パスワードの正規表現の考え方
「~を含まない行」を検索する方法
「~を含む行」を検索する方法
「~で終わる」を検索する方法
「~で始まる」を検索する方法
正規表現繰り返しの考え方

最短一致検索を行う方法
否定の文字クラス
「または」検索を行う方法


★置換
正規表現置換の考え方
大文字⇔小文字変換を行う方法
キャメルケース⇔スネークケース変換を行う方法
CSVを囲みなし⇒囲みありに変換する方法

数字3ケタおきにカンマを挿入する方法
Javaで正規表現置換を行う方法

また、Udemyという動画教育プラットフォームで動画解説を行っております。
動きを確認しながら丁寧に学習したいという方は、ぜひご覧ください!

正規表現入門 作業効率アップに役立つ38個の方法

    コメント

    タイトルとURLをコピーしました