目次
繰り返しの正規表現は、そのままの状態で使用すると最長一致検索になります。
つまり、その表現であらわすことのできる一番長い文字に一致します。
最長一致の例
本サイトのOpenLayersの記事のソースコードを例に解説します。
このソースコードの中から「シングルコーテーションで囲まれた文字」を検索します。
何も考えずに正規表現を記述すると、下記のようになると思います。
'.*'
これで検索を行うと下記のようになります。
一見すると、きちんと検索が行われているように見えますが、
606行目、607行目については、シングルコーテーションに囲まれていない箇所についても、検索に引っかかっています。
これが、最長一致検索と呼ばれるもので、繰り返しの正規表現の通常の挙動となります。
最長一致のマッチの仕方
動作は以下のようになっております。(606行目)
- シングルコーテーションが存在するか、行頭から検索を開始する。
- シングルコーテーションが見つかる
- 「.*」(=なんでもいいから0文字以上)に続く、2つ目のシングルコーテーションを探しに行く
- “color”の後ろのシングルコーテーションが見つかる
- 後ろにシングルコーテーションがないか、さらに後ろを検索する
- “white”の前に、シングルコーテーションが見つかる
- 後ろにシングルコーテーションがないか、さらに後ろを検索する
- “white”の後ろにシングルコーテーションが見つかる
- 後ろにシングルコーテーションがないか、さらに後ろを検索する
- みつからないので、一番最後に見つかったシングルコーテーションまでをマッチさせる
上記のように、「.*」という表現は、可能な限り長い文字をマッチさせに行こうとします。
最短一致検索
しかし、これでは、「シングルコーテーションに囲まれた文字だけを検索したい」ということができません。
そこで、最短一致検索を行うようにするために、正規表現を修正します。
'.*?'
先ほどの正規表現に「?」を追加しただけです。
これで検索するとこのようになります。
シングルコーテーションで囲まれた文字のみが検索に引っかかるようになります。
最短一致検索のマッチの仕方
最短一致検索は以下のようにマッチします。(606行目)
- シングルコーテーションが存在するか、行頭から検索を開始する。
- シングルコーテーションが見つかる
- 「.*」(=なんでもいいから0文字以上)に続く、2つ目のシングルコーテーションを探しに行く
- “color”の後ろのシングルコーテーションが見つかる
- 2つめのシングルコーテーションが見つかった時点で、即時に検索を終了する
繰り返し記号の「*」の後ろに「?」を付けることで、上記のような最短一致の挙動になります。
今回は、なんでもいいから0文字以上を表す「*」の直後につけて、最短一致検索を解説しましたが、
「{}」「+」など、他の繰り返しの正規表現でも、後ろに「?」を付けることで、最短一致検索になります。
まとめ
今回は最短一致検索についてお伝えしました。
繰り返しを表す正規表現の後ろに「?」を付けることで、最短一致検索になります。
最長一致ではできない検索を、最短一致ではできるようになります。
みなさんも色々と遊んでみてください。
正規表現についての別記事についてもご覧ください!
★検索
パスワードの正規表現の考え方
「~を含まない行」を検索する方法
「~を含む行」を検索する方法
「~で終わる」を検索する方法
「~で始まる」を検索する方法
正規表現繰り返しの考え方
最短一致検索を行う方法
否定の文字クラス
「または」検索を行う方法
環境による「\d」の動作の違いについて検証
★置換
正規表現置換の考え方
大文字⇔小文字変換を行う方法
キャメルケース⇔スネークケース変換を行う方法
CSVを囲みなし⇒囲みありに変換する方法
CSVファイルの特定のカンマ以降を削除する方法
CSVファイルの必要な箇所だけ残す方法
数字3ケタおきにカンマを挿入する方法
正規表現置換で不要な行を削除し、必要な行だけ残す方法
数字を0埋めする方法
0埋めされた数字を0埋めなしに変換する方法
ファイル名から、拡張子のみを抽出する方法
Javaで正規表現置換を行う方法
また、Udemyという動画教育プラットフォームで動画解説を行っております。
動きを確認しながら丁寧に学習したいという方は、ぜひご覧ください!
コメント