ファイルパス・ファイル名から、拡張子のみを抽出する方法

正規表現

ファイルを扱うシステムを構築する際、ファイルの拡張子のみを抽出したいという場面があります。

  • システム側が想定した拡張子のファイルのみを処理し、それ以外の拡張子が連携された場合にはシステムエラーにしたい
  • 拡張子のみをDBに登録して管理したい

正規表現置換を用いることで、ファイルパス・ファイル名の拡張子部分のみを抽出することができます。

実践

以下のような文字列があるとします。

c:\aaa.txt
c:\bbb.jpg
d:\ccc.xlsx
/tmp/ddd.sh
eee.png
\\server\fff.exe
https://ggg.com/hhh.pdf
c:\iii.jjj.kkk.zip

以下の正規表現で拡張子のみを抽出できます。

置換前

^.*\.(.*)$

置換後

$1

実行すると以下のような結果になります。

各行、拡張子のみが抽出されました。

解説

^.*\.(.*)$

上記は「一番最後の『.』から行末までをキャプチャする」正規表現です。

→キャプチャについてはこちらの記事で解説しています。

前半部分

^.*\.

の部分と、

後半部分

(.*)$

に分けて考えます。

前半部分

  • 「^」は行頭を表します。
  • 「.*」は「なんでもいいから0文字以上」という意味です。
  • 「\.」はドット<.>自体を表します。

組み合わせると行頭からドット<.>が登場するまで、なんでもいいから0文字以上繰り返すという意味です。

さらにこれは最長一致検索で、一番最後のドット<.>までを意味します。
そのため、何個ドット<.>があったとしても、一番最後のドット<.>までマッチします。

→ちなみに行頭から一番近いドット<.>を検索する場合は「^.*?\.」と表現します。

後半部分

最後の「$」は行末を表します。
「.*$」とすることで、「行末まで、なんでもいいから0文字以上」という意味になります。

今回の場合、「なんでもいいから0文字以上」の部分がファイル拡張子に当たります。

そして、その「なんでもいいから0文字以上」を「()」とすることで、キャプチャします。
キャプチャすることで、正規表現置換の際に「$1」で、該当部分を使用することができます。

つまり、「なんでもいいから0文字以上」に当たる拡張子部分を、正規表現置換時に使用することができます。

正規表現置換

今までの全てを組み合わせた「^.*\.(.*)$」という表現は、「行頭から、最後のドット<.>が現れるまで、0文字以上を繰り返し、ドット<.>が登場した後は、なんでもいいから0文字以上を行末まで繰り返す。さらに、後半の『なんでもいいから0文字以上』についてはキャプチャする」という意味になります。

この正規表現にマッチした文字列を「$1」で置換します。
上記で説明したように、これはキャプチャされた部分を表します。

つまり、拡張子部分のみが残るということになります。

まとめ

今回は、ファイル名・ファイルパスから拡張子部分のみを抽出する正規表現置換について解説しました。

システム開発において、拡張子のみを必要とする場合に使用してみてください。

※ただし、拡張子とはファイルの実態を表すためのただの目印であり、容易に偽装できます。
例えば、拡張子は「jpg」であっても、ファイルの実態は「png」であるという状況はあり得るということに留意しましょう。

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

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

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

環境による「\d」の動作の違いについて検証

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

CSVファイルの特定のカンマ以降を削除する方法
CSVファイルの必要な箇所だけ残す方法
数字3ケタおきにカンマを挿入する方法
正規表現置換で不要な行を削除し、必要な行だけ残す方法
数字を0埋めする方法
0埋めされた数字を0埋めなしに変換する方法
ファイル名から、拡張子のみを抽出する方法
Javaで正規表現置換を行う方法

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

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

コメント

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