ひよこ3:07のTechブログ

JavaScriptでファイル名を拡張子とそれ以外に分ける

拡張子とそれ以外

元ネタ : 【JavaScript】ファイル名(拡張子あり)からファイル名(拡張子なし)と拡張子に分割する(正規表現) - Qiita

String#match()じゃなくてString#split()でできるとなんかコードの意味的にもスッキリしそう、っていう思いつきで書いてみた。

function splitExt(filename) {
    return filename.split(/\.(?=[^.]+$)/);
}

splitExt('img.jpg');  // => [ 'img',   'jpg'  ]
splitExt('.html');    // => [ '',      'html' ]
splitExt('lib.d.ts'); // => [ 'lib.d', 'ts'   ]
splitExt('abc');      // => [ 'abc'           ]

元ネタはString#match()を使っているから、拡張子がない場合にnullなるし、そうなるとnullチェックとか必要になって面倒な気がする。こっちの方法だと拡張子無いパターンでも配列が帰ってきてて若干使いやすいかもしれない。

ドット

ドット含むバージョンも。

function splitExt(filename) {
    return filename.split(/(?=\.[^.]+$)/);
}

splitExt('img.jpg');  // => [ 'img',   '.jpg' ]
splitExt('.html');    // => [ '.html'         ]
splitExt('lib.d.ts'); // => [ 'lib.d', '.ts'  ]
splitExt('abc');      // => [ 'abc'           ]

ドットで始まる場合に少し挙動が変わっている。

".gitignore"とかを拡張子として処理するのは違う気がするので、実際のファイル名を扱うなら、こっちの挙動のほうがいいかもしれない。場合によって使い分ける感じかな。

Node

Nodeだとpathモジュールのextname()っていう関数で拡張子だけ抜き出せる。

var path = require('path');

path.extname('img.jpg');  // => '.jpg'
path.extname('.html');    // => ''
path.extname('lib.d.ts'); // => '.ts'
path.extname('abc');      // => ''

ブラウザとNodeで共通して使える汎用パス操作ライブラリとかあるといいかもしれない。どれくらい使われるかわかんないけど。