Node.jsでglobパターンを、RegExpに変換するBetterな法方
小ネタです。
結論
以下のコードでglob
の文字列をRegExp
の文字列に変換することができました。
const minimatch = require('minimatch').Minimatch;
const globToRegExp = glob => {
const regexp = new minimatch(glob).makeRe();
if (!regexp) throw new Error(`globに変換できません。glob: "${glob}"`);
return regexp.toString().slice(1, -1); // 前後に `/` がついてしまうので、sliceする
};
解説
glob
をRegExp
に変換する際にちょうど良いライブラリを見つけるのに時間がかかったので、本記事を書きました。
まず glob to regexp
などで検索すると glob-to-regexp のようなパッケージが出てきます。NPMでは相当なダウンロード数がありそうですが、レポはpublicアーカイブになっており、このまま利用するのも少し気が引ける状況でした。
そこで、Node.js
でglob
を使ってファイルを読み込む際の定番ライブラリ glob を見てみたところ、内部的に minimatch というパッケージを利用してパターンマッチさせているとの記述があります。
では、minimatch
の方をみてみると、NPMのno内部でglob
パターンマッチに利用されており、glob
文字列をJSのRegExp
オブジェクトに変換できるという旨記載がありました。確かにNPMのレポジトリをみると、package.json に記載されています。
以上から、Node.js
を利用する以上、NPMと同じロジックでglob
を扱うのが自然と考えminimatch
を利用することにしました。
minimatch
の中には makeRe()
という関数があり、これで RegExp
オブジェクトを吐き出せるようです。
ちなみに、RegExpオブジェクトにはtoString()
メソッドが利用できますが、/./.toString() → '/./'
のように、前後に /
がつくので、.slice(1, -1)
でとってあげるようにしないと、RegExp
<> string
間の相互変換は冪等な操作にならないようです。
以上、小ネタでしたが参考になれば幸いです。